代码随想录算法训练营Day39 | 322. 零钱兑换 | 279.完全平方数 | 139.单词拆分

今日任务

322. 零钱兑换

Code

cpp 复制代码
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int n = coins.size();

        // vector<vector<int>> memo(n, vector<int>(amount + 1, -1));
        // function<int(int, int)> dfs = [&](int i, int c) -> int{
        //     if(i < 0){
        //         return c == 0 ? 0 : INT_MAX / 2;
        //     }
        //     int &res = memo[i][c];
        //     if(res != -1){
        //         return res;
        //     }
        //     if(c < coins[i]){
        //         return res = dfs(i - 1, c);
        //     }
        //     return res = min(dfs(i - 1, c), dfs(i, c - coins[i]) + 1);
        // };
        // int ans = dfs(n - 1, amount);
        // return ans < INT_MAX /2 ? ans : -1;

        // dp[i][c] = min(dp[i - 1][c], dp[i][c - coins[i]] + 1)
        // dp[i + 1][c] = min(dp[i][c], dp[i + 1][c - coins[i]] + 1)
        // vector<vector<int>> dp(n + 1, vector<int>(amount + 1, INT_MAX / 2));
        // dp[0][0] = 0;
        // for(int i = 0; i < n; i++){
        //     for(int c = 0; c <= amount; c++){
        //         if(c < coins[i]){
        //             dp[i + 1][c] = dp[i][c];
        //         }else{
        //             dp[i + 1][c] = min(dp[i][c], dp[i + 1][c - coins[i]] + 1);
        //         }
        //     }
        // }
        // return dp[n][amount] < INT_MAX / 2 ? dp[n][amount] : -1;

        // 优化
        // vector<vector<int>> dp(2, vector<int>(amount + 1, INT_MAX / 2));
        // dp[0][0] = 0;
        // for(int i = 0; i < n; i++){
        //     for(int c = 0; c <= amount; c++){
        //         if(c < coins[i]){
        //             dp[(i + 1) % 2][c] = dp[i % 2][c];
        //         }else{
        //             dp[(i + 1) % 2][c] = min(dp[i % 2][c], dp[(i + 1) % 2][c - coins[i]] + 1);
        //         }
        //     }
        // }
        // return dp[n % 2][amount] < INT_MAX / 2 ? dp[n % 2][amount] : -1;

        vector<int> dp(amount + 1, INT_MAX / 2);
        dp[0] = 0;
        for(int x : coins){
            for(int c = x; c <= amount; c++){
                dp[c] = min(dp[c], dp[c - x] + 1);
            }
        }
        return dp[amount] < INT_MAX / 2 ? dp[amount] : -1;
    }
};

279.完全平方数

Code

cpp 复制代码
class Solution {
public:
    int numSquares(int n) {
        int end = sqrt(n);
        
        vector<vector<int>> memo(end + 1, vector<int>(n + 1, -1));
        function<int(int, int)> dfs = [&](int i, int c) -> int{
            if(i == 0){
                return c == 0 ? 0 : INT_MAX / 2;
            }
            int res = memo[i][c];
            if(res != -1){
                return res;
            }
            int x = i * i;
            if(c < x){
                return res = dfs(i - 1, c);
            }
            return res = min(dfs(i - 1, c), dfs(i, c - x) + 1);
        };
        return dfs(end, n);

        // vector<int> dp(n + 1, INT_MAX / 2);
        // dp[0] = 0;
        // for(int x = 1; x <= end; x++){
        //     for(int c = x * x; c <= n; c++){
        //         dp[c] = min(dp[c], dp[c - x * x] + 1);
        //     }
        // }
        // return dp[n];
    }
};

139.单词拆分

Code

cpp 复制代码
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        int n = s.size();
        unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
        vector<bool> dp(n + 1);
        dp[0] = true;
        for(int i = 1; i <= n; i++){
            for(int j = 0; j < i; j++){
                string word = s.substr(j, i - j);
                if(wordSet.contains(word)){
                    dp[i] = dp[i] || dp[j];
                }
            }
        }
        return dp[n];
    }
};
相关推荐
穿条秋裤到处跑4 分钟前
每日一道leetcode(2026.04.19):下标对中的最大距离
算法·leetcode·职场和发展
Sag_ever17 分钟前
时间复杂度与空间复杂度超详细入门讲解
算法
念越18 分钟前
算法每日一题 Day03|快慢双指针解决快乐树问题
算法·力扣
ZPC821021 分钟前
MoveGroup 规划轨迹 → 直接交给 MoveIt2 Servo 执行
人工智能·算法·计算机视觉·机器人
️是7830 分钟前
信息奥赛一本通—编程启蒙(3373:练64.2 图像旋转翻转变换)
数据结构·c++·算法
木子墨5161 小时前
LeetCode 热题 100 精讲 | 计算几何篇:点积叉积 · 线段相交 · 凸包 · 多边形面积
c++·算法·leetcode·职场和发展·动态规划
源码之家1 小时前
计算机毕业设计:Python棉花产业数据可视化与预测系统 Django框架 ARIMA算法 数据分析 可视化 爬虫 大数据 大模型(建议收藏)✅
人工智能·python·算法·信息可视化·数据挖掘·django·课程设计
py有趣1 小时前
力扣热门100题之最小路径和
算法·leetcode
qeen871 小时前
【算法笔记】前缀和经典题目解析
c语言·c++·笔记·学习·算法
Je1lyfish1 小时前
Haskell 初探
开发语言·笔记·算法·rust·lisp·抽象代数