当前位置: 首页 > 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];
}


http://www.mrgr.cn/news/13437.html

相关文章:

  • Leetcode19删除链表的倒数第K个节点(java实现)
  • 论文翻译:Multi-step Jailbreaking Privacy Attacks on ChatGPT
  • kafka ---- producer与broker配置详解以及ack机制详解
  • Qt笔记-setRowCount(int rows)方法
  • 使用 Pandas 进行数据可视化:全面指南(六)
  • 【ShuQiHere】《机器学习的进化史『上』:从数学模型到智能算法的百年征程》
  • 较难!第15届蓝桥杯青少组省赛Scratch中级组编程真题
  • OpenCV绘图函数(6)绘制椭圆函数ellipse()的使用
  • 计算机网络 - 应用层
  • C++ STL 关联容器
  • 代码随想录算法训练营第五十二天 | 图论part03
  • 企业级NoSql数据库 --- Redis集群
  • AI的未来已来:GPT-4商业应用带来的无限可能
  • 【python报错已解决】AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘
  • 医疗数字化转型数据中台架构方案(四)
  • Mybatis】Mybatis-Plus 高级
  • Android12 Toast连续多次点击后不显示
  • 使用kafka完成数据的实时同步,同步到es中。(使用kafka实现自动上下架 upper、lower)
  • 大白话【8】WindowsServer2016搭建DNS服务
  • python基础(11文件读取)