LeetCode279.Perfect-Squares<完全平方数>
发布人:shili8
发布时间:2025-03-04 07:02
阅读次数:0
**完全平方数**
给定一个正整数 `n`,返回所有小于或等于 `n` 的完全平方数的列表。
**示例1:**
输入:`n =12`
输出: `[1,4,9,16,25]`
**示例2:**
输入:`n =13`
输出: `[1,4,9,16,25]`
**示例3:**
输入:`n =0`
输出: `[]`
**解决方案**
我们可以使用以下方法来解决这个问题:
* **方法1:暴力破解**
* 我们可以先生成所有小于或等于 `n` 的完全平方数,然后返回它们的列表。
* 这个方法的时间复杂度为 O(n^(3/2)),因为我们需要遍历所有小于或等于 `n` 的数字,并检查每个数字是否是完全平方数。
import mathdef perfectSquares(n): # 方法1:暴力破解 squares = [] for i in range(1, int(math.sqrt(n)) +1): square = i **2 if square <= n: squares.append(square) return squares
* **方法2:二分查找**
* 我们可以先找到小于或等于 `n` 的最大完全平方数,然后使用二分查找来找到所有小于或等于该数字的完全平方数。
* 这个方法的时间复杂度为 O(log n),因为我们需要进行二分查找。
import mathdef perfectSquares(n): # 方法2:二分查找 max_square = int(math.sqrt(n)) squares = [] left, right =1, max_square while left <= right: mid = (left + right) //2 square = mid **2 if square <= n: squares.append(square) left = mid +1 else: right = mid -1 return squares
* **方法3:动态规划**
* 我们可以使用动态规划来找到所有小于或等于 `n` 的完全平方数。
* 这个方法的时间复杂度为 O(n),因为我们需要遍历所有小于或等于 `n` 的数字。
def perfectSquares(n): # 方法3:动态规划 dp = [0] * (n +1) for i in range(1, n +1): j =1 while j **2 <= i: dp[i] +=1 j +=1 return dp[1:]
**总结**
我们可以使用三种不同的方法来解决这个问题:暴力破解、二分查找和动态规划。每个方法的时间复杂度不同,但都能得到正确的结果。
最终答案是:
import mathdef perfectSquares(n): # 方法1:暴力破解 squares = [] for i in range(1, int(math.sqrt(n)) +1): square = i **2 if square <= n: squares.append(square) return squares# 或者使用以下方法: def perfectSquares(n): # 方法2:二分查找 max_square = int(math.sqrt(n)) squares = [] left, right =1, max_square while left <= right: mid = (left + right) //2 square = mid **2 if square <= n: squares.append(square) left = mid +1 else: right = mid -1 return squares# 或者使用以下方法: def perfectSquares(n): # 方法3:动态规划 dp = [0] * (n +1) for i in range(1, n +1): j =1 while j **2 <= i: dp[i] +=1 j +=1 return dp[1:]