今日任务
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.单词拆分
- 题目链接: https://leetcode.cn/problems/word-break/description/
- 题目描述 :
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];
}
};