输出四位完全平方数_leetcode279_go_完全平方数

题目

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。

你需要让组成和的完全平方数的个数最少。

示例 1:输入: n = 12 输出: 3

解释: 12 = 4 + 4 + 4.

示例 2:输入: n = 13 输出: 2

解释: 13 = 4 + 9.

解题思路分析

1、动态规划;时间复杂度O(n^(3/2)),空间复杂度O(n)

func numSquares(n int) int {dp := make([]int, n+1)for i := 1; i <= n; i++ {dp[i] = math.MaxInt32}arr := make([]int, 0)arr = append(arr, 0)for i := 1; i*i <= n; i++ {arr = append(arr, i*i)}for i := 1; i <= n; i++ {for j := 1; j*j <= i; j++ {if i < arr[j] {break}dp[i] = min(dp[i], dp[i-arr[j]]+1)}}return dp[n]}func min(a, b int) int {if a > b {return b}return a}

2、动态规划;时间复杂度O(n^(3/2)),空间复杂度O(n)

905a4d454b25febf534c929abb4478fc.png
func numSquares(n int) int {dp := make([]int, n+1)for i := 1; i <= n; i++ {dp[i] = ifor j := 1; j*j <= i; j++ {dp[i] = min(dp[i], dp[i-j*j]+1)}}return dp[n]}func min(a, b int) int {if a > b {return b}return a}

3、广度优先搜索;时间复杂度O(n^(1/2)),空间复杂度O(n^(1/2))

func numSquares(n int) int {if n == 0 {return 0}list := make([]int, 0)list = append(list, n)level := 0for len(list) > 0 {level++length := len(list)for i := 0; i < length; i++ {value := list[i]for j := 1; j*j <= value; j++ {if j*j == value {return level}list = append(list, value-j*j)}}list = list[length:]}return level}

4、递归;时间复杂度O(n^(1/2)),空间复杂度O(n^(1/2))

var m map[int]intfunc numSquares(n int) int {m = make(map[int]int)return dfs(n)}func dfs(n int) int {if m[n] > 0 {return m[n]}if n == 0 {return 0}count := math.MaxInt32for i := 1; i*i <= n; i++ {count = min(count, dfs(n-i*i)+1)}return count}func min(a, b int) int {if a > b {return b}return a}

5、数学;时间复杂度O(n^(1/2)),空间复杂度O(1)

func numSquares(n int) int {if judge(n) {return 1}res := nfor res%4 == 0 {res = res / 4}if res%8 == 7 {return 4}for i := 1; i*i < n; i++ {if judge(n - i*i) {return 2}}return 3}func judge(n int) bool {value := int(math.Sqrt(float64(n)))return value*value == n}

总结

Medium题目,多种解法,动态规划方法需要掌握

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值