动态规划

public class Solution
{
public int NumSquares(int n)
{
var list = new List<int>();
list.Add();
for (int i = ; i <= n; i++)
{
list.Add(i);//每一个数字,初始化为全部由1构成
}
for (int i = ; i <= n; i++)
{
for (int j = ; j * j <= i; j++)
{
var x = list[i];//当前值的构成数量,由全部是1来构成
var s = i - j * j;//减去一个平方数后的余数
var t = list[s];//余数值的构成数量
var y = t + ;//因为减过j*j,因此用余数的构成数量+1,相当于计算原值的构成数量 list[i] = Math.Min(x, y);
}
}
return list[n];
}
}

补充一个python的实现,在leetcode上会TLE,经查询发现在讨论区中也有其他的人遇到了相同的TLE问题。

应该是对python语言的判断机制有问题,这种“平台语言杀”的问题出现过多次了。

 class Solution:
def numSquares(self, n: int) -> int:
dp = [] * (n + )
#初始化,所有的数字都由''组成,dp中每个元素值为组成的数量
for i in range(,n+):
dp[i] = i
for i in range(,n+):
for j in range(,int(i**0.5)+):
res = i - j * j#减去一个完全平方数后的剩余值
dp[i] = min(dp[i],dp[res] + )
return dp[n]

经过修改可以AC了,但是效率是比较低的:

 class Solution:
def numSquares(self, n: int) -> int:
dp = list(range(n+1))
for i in range(,n+):
for j in range(,int(i**0.5)+):
res = i - j * j#减去一个完全平方数后的剩余值
dp[i] = min(dp[i],dp[res] + )
return dp[n]

既然python不能用dp方法提交,那就再提供一种别的思路,使用广度优先遍历(BFS):

 class Solution:
def numSquares(self, n: int) -> int:
power = set()
base =
#生成符合条件的所有完全平方数,存储在power集合中
while base*base <= n:
curnum = base*base
if curnum == n:
return
power.add(curnum)
base +=
#level为返回值,表示最少的完全平方数的数量
level =
#初始目标设置为n
target = {n}
#判断条件target不为空
while len(target) > :
cur = set()
#在目标集合中循环,获得一个值
for i in target:
#在完全平方数集合中循环,获得一个值
for e in power:
#目标值 - 某个完全平方数 的差值,也是完全平方数
if i-e in power:
#返回 当前level +
return level+
#目标值 - 某个完全平方数 的差值,不是完全平方数,且大于0
if i-e > :
#将这个差值存储在‘下一层’
cur.add(i-e)
#用下一层的值更新target
target = cur
#层级+
level +=

以n=15为例,其计算流程如下:

先计算小于等于15的值中,所有的完全平方数,如上图矩形区域所示(1,4,9)三个数值。

第一层的target中的值是:(15),用15分别减去power中的数值,得到第二层;

第二层的target中的值是:(14,11,6),三个数字都不在target集合中,因此继续计算第三层,用这三个数字分别减去power中的数值,得到第三层;

第三层的target中的值是:(13, 10, 5, 10, 7, 2, 5, 2, -3),其中10,5,2出现了重复,使用set会自动去重,而-3 小于0,也会被过滤掉,

最终得到第三层的数值为:(13,10,5,7,2),这五个数字都不在power中,因此继续用这5个数字计算第四层:

当计算5时,可得到 5 - 1 = 4,而4在power中,因此结束循环。此时节点5所在的“树的高度”为3(根结点从1开始计算),因此level + 1 等于4。

最终返回4,即为所求,最终的完全平方数的组合是由线上的被减的值和叶子节点的值组成,即:[1,9,1,4]。

leetcode279的更多相关文章

  1. leetcode279. Perfect Squares

    learn from DP class Solution { public: int numSquares(int n) { if(n<=0)return 0; int * dp = new i ...

  2. [Swift]LeetCode279. 完全平方数 | Perfect Squares

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...

  3. leetcode279. 完全平方数

    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12输出: 3 解释: 12 = ...

  4. Leetcode279. Perfect Squares完全平方数

    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: 3 解释: 12 ...

  5. 图解leetcode279 —— 完全平方数

    每道题附带动态示意图,提供java.python两种语言答案,力求提供leetcode最优解. 描述: 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于  ...

  6. leetcode探索高级算法

    C++版 数组和字符串 正文 链表: 正文 树与图: 树: leetcode236. 二叉树的最近公共祖先 递归(先序) leetcode124二叉树最大路径和 递归 图: leetcode 547朋 ...

随机推荐

  1. Alpha冲刺9

    前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10034872.html 作业博客:https://edu.cnblogs.com/campus ...

  2. Python基础03_pycharm

    pycharm的安装还是很简单的,一路next. 看起来Jet Brains 家的产品长相都差不多啊. 主要是create new project时,路径和解释器的选择,我电脑上有2.7和3.6 所以 ...

  3. Python实现基于DES加密源码的文本加密器

    这是自行制作的一个DES文本加密工具 最终效果图: 本加密器支持UTF-8字符的加解密(包含中文),由于其中的编码方式与常用编码方式不同,加密结果与网上工具不同,但是能实现正常加解密. 最终目标: 目 ...

  4. linux command 2

    #修改文件所有权为user group chown user:group file/group 根据:的位置判断是修改所有者还是组 #修改文件读写执行属性 chmod mask file/group ...

  5. 【开发遇到的问题】Spring Mvc使用Jackson进行json转对象时,遇到的字符串转日期的异常处理(JSON parse error: Can not deserialize value of type java.util.Date from String[)

    1.问题排查 - 项目配置 springboot 2.1 maven配置jackson - 出现的场景: 服务端通过springmvc写了一个对外的接口,查询数据中的表,表中有一个字段属性是时间戳,返 ...

  6. STL:unique()函数

    unique() unique()是剔除重复他是剔除相邻之间字符重复的,倘若其中中的字符前后之间是没有重复的,unique函数是起不到作用的,所以使用以前都会sort处理. unique()函数的返回 ...

  7. [Java] 方法 -- 繼承關係

    public class test { void show() { System.out.println("父類別"); } } public class test2 extend ...

  8. UltraISO 9.7.1.3519注册码

    王涛 7C81-1689-4046-626F redcaps 82C6-3DEF-AB07-0EC0

  9. mac 中host设置方法

    在开发中,有的接口为了安全考虑,只能通过指定的域名去反问,这时本地启动的 localhost 就无法获取到数据,需要去更改电脑的host文件配置,下面介绍mac 电脑的设置方法 1. 打开终端,输入一 ...

  10. Hbase Filter过滤器查询详解

    过滤器查询 引言:过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器 过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端: hbase过滤器的比较运算符: LE ...