Uriel's Corner

Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
posts - 0, comments - 50, trackbacks - 0, articles - 594
给定一个数n,问它最少由几个平方数加和而成(可以重复使用)
先预处理算出比n小的平方数,再用DP思想,直接O(n^2)的话python会TLE,所以第二重循环需要优化为logn
借鉴Discussion的思路:https://leetcode.com/problems/perfect-squares/discuss/2837770/Python3-DP-with-Detailed-Explanations-O(-n-sqrt(n)-)-not-TLE
第二重循环只要遍历预处理的平方数的数组

另一个小trick:把dp[0]写作class变量可以节省很多时间,如果写在numSquares函数内依旧TLE
“Make dp a class variable, so that it will not rebuild dp from 0 for different testing cases.”

 1 #279
 2 #Runtime: 309 ms
 3 #Memory Usage: 13.3 MB
 4 
 5 class Solution(object):
 6     dp = [0]
 7     def numSquares(self, n):
 8         """
 9         :type n: int
10         :rtype: int
11         """
12         sq_num = [i**2 for i in range(1, int(sqrt(n)) + 1)]
13         while len(self.dp) < n + 1:
14             t = 10001
15             for i in sq_num:
16                 if i > len(self.dp):
17                     break
18                 t = min(t, 1 + self.dp[-i])
19             self.dp.append(t)
20         return self.dp[n]
21             



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理