当前位置: 首页 > news >正文

279.完全平方数

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149 和 16 都是完全平方数,而 3 和 11 不是。

:痕迹

class Solution {public int numSquares(int n) {// 从nums(完全平方数构成的数组)选和为n的组合// 1、4、9、16、25、36、49、64...int sqrt = (int)Math.sqrt(n);int[] nums = new int[sqrt];for(int i = 0; i < nums.length; i++){nums[i] = (i + 1) * (i + 1);}// 容量n// dp代表数量,// dp[j]的值是如何保证,当容量为j的时候,找到【数量最少】的【和为j】的int[] dp = new int[n + 1];int max = Integer.MAX_VALUE;for(int i = 1; i <= n; i++) dp[i] = max;/*for(int i = 1; i <= n; i++){for(int j = 0; j < nums.length; j++){// 每次就决定加 / 不加 这个数。而这个数不是连续递增的,1.4.9.16.25.// 那就说明,必定有一些数,不能由nums中的数相加的来(不是的,nums中还有1,所以必定能表示所有数字)// 加不了当前的数if(i < nums[j]) dp[i] = dp[i - 1];// 加上当前这个nums[j],则数量dp +1else dp[i] = Math.min(dp[i], dp[i - nums[j]] + 1);}}*/// dp[0] = 1;for(int i = 0; i < nums.length; i++){for(int j = nums[i]; j <= n; j++){if(j == nums[i]) dp[j] = 1;else dp[j] = Math.min(dp[j], dp[j - nums[i]] + 1);}}return dp[n];}
}

感想:dp不知道先遍历容量还是数组的话,就都尝试一下。

i=0i=1i=2
0000
11
22
33
441
552
663
774
882
9931
101042
111153
121234

 每个容量(上图中的行数据)取后面的最小值。对应代码:dp[j] = Math.min(dp[j], dp[j - nums[i]] + 1);

:默写加深印象

public int numSquares(int n){// 需要自己构造数组int sqrt = (int)Math.sqrt(n);int[] nums = new int[sqrt];for(int i = 0; i < sqrt; i++) nums[i] = (i + 1) * (i + 1);// int[] dp = new int[n + 1];int max = Integer.MAX_VALUE;for(int i = 1; i <= n; i++) dp[i] = max;for(int i = 0; i < nums.length; i++){for(int j = nums[i]; j <= n; j++){if(j == nums[i]) dp[j] = 1;else dp[j] = Math.min(dp[j], dp[j - nums[i]] + 1);}}return dp[n];
}

:改进

public int numSquares(int n){// 需要自己构造数组int sqrt = (int)Math.sqrt(n);int[] nums = new int[sqrt];for(int i = 0; i < sqrt; i++) nums[i] = (i + 1) * (i + 1);// int[] dp = new int[n + 1];int max = Integer.MAX_VALUE;// 这里要么从1开始遍历,要么从0开始,但还要把dp[0] = 0初始化。for(int i = 1; i <= n; i++) dp[i] = max;for(int i = 0; i < nums.length; i++){for(int j = nums[i]; j <= n; j++){dp[j] = Math.min(dp[j], dp[j - nums[i]] + 1);}}return dp[n];
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Qt 事件】—— 详解Qt事件处理
  • 代码随想录Day 31|leetcode题目:56.合并区间、738.单调递增的数字、968.监控二叉树
  • 【网络原理】从0开始学习计算机网络常识,中学生看了都能学会
  • 倒计时1天!每日一题,零基础入门FPGA
  • 【时间盒子】-【2.准备】HarmonyOS 开发前需要准备什么?
  • Mysql8 主从复制主从切换(超详细)
  • 如何在 CentOS 6 上安装 Nagios
  • 面试(九)
  • 今日算法:蓝桥杯基础题之“星期一”
  • 【Nest 学习笔记】AOP切片编程
  • python执行安装包文件时报错
  • 微信卸载后重新安装聊天记录怎么恢复?4招轻松找回微信数据
  • 最大交换
  • 哈希基础概念即使用(C++)
  • 华为云征文 | 华为云Flexus云服务器X实例全面使用操作指南
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java精华积累:初学者都应该搞懂的问题
  • Java深入 - 深入理解Java集合
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue-loader 源码解析系列之 selector
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用common-codec进行md5加密
  • 为视图添加丝滑的水波纹
  • 字符串匹配基础上
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​iOS实时查看App运行日志
  • ​如何在iOS手机上查看应用日志
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #QT(一种朴素的计算器实现方法)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (第二周)效能测试
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (论文阅读11/100)Fast R-CNN
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ****三次握手和四次挥手
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .net打印*三角形
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .project文件
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • ??javascript里的变量问题