LeetCode 279. 完全平方数

279. 完全平方数icon-default.png?t=N7T8https://leetcode.cn/problems/perfect-squares/description/?envType=study-plan-v2&envId=top-100-liked这题我想的递推式本来是这样的:f(n) = min_{1\leq i \leq n/2} (f(i) + f(n - i));用记忆化递归结果超时了。看了一下题解发现其实上式的i完全可以只考虑是完全平方数的情况。所以其实递归式是这样的:f(n) = min_{1\leq i \leq\sqrt{n/2}} (f(i^2) + f(n-i^2)),而f(i^2)肯定是1,所以最终递推式为:f(n) = min_{1\leq i \leq\sqrt{n/2}} (1 + f(n-i^2))

我还是用的记忆化递归,因为个人感觉记忆化递归比动态规划更通用一些,而且写起来更简单,虽然效率可能会差一些。如下。

class Solution {
public:
    int numSquares(int n) {
        vector<int> mem(n + 1, 0);
        function<int (int)> f = [&] (int x) -> int {
            if (mem[x] != 0) return mem[x];
            int i = sqrt(x);
            if (i * i == x) {
                mem[x] = 1;
                return 1;
            }
            int res = INT_MAX;
            for (int j = 1; j*j <= x/2; ++j) {
                res = min(res, 1 + f(x-j*j));
            }   
            mem[x] = res;
            return res;
        };

        return f(n);
        
    }
};

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值