给你一个整数数组 coins
,表示不同面额的硬币;以及一个整数 amount
,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的。
示例 1:
输入:coins =[1, 2, 5]
, amount =11
输出:3
解释:11 = 5 + 5 + 1
class Solution {
public:
int coinChange(vector<int>& coins, int amount)
{
vector<int> dp(amount+1,INT_MAX );
dp[0] = 0;
for(int i = 0; i < coins.size(); i++)
{
for(int j = coins[i]; j <= amount ; j++)
{
if(dp[ j - coins[i]] != INT_MAX)
{
dp[j] = min(dp[j],dp[j - coins[i]]+1);
}
}
}
if(dp[amount] == INT_MAX) return -1;
return dp[amount];
}
};
给你一个整数 n
,返回 和为 n
的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1
、4
、9
和 16
都是完全平方数,而 3
和 11
不是。
示例 1:
输入:n =12
输出:3 解释:12 = 4 + 4 + 4
class Solution {
public:
int numSquares(int n)
{
vector<int> dp(n+1,INT_MAX);
dp[0] = 0;
for(int i = 0 ; i*i <= n;i++ )
{
for(int j = i*i; j <= n; j++)
{
if(dp[j - i*i] != INT_MAX)
{
dp[j] = min(dp[j],dp[j - i*i]+1);
}
}
}
return dp[n];
}
};
给你一个字符串 s
和一个字符串列表 wordDict
作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s
则返回 true
。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"] 输出: true 解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict)
{
unordered_set<string> mystring(wordDict.begin( ),wordDict.end( ));
vector<bool> dp(s.size() + 1 , false);
dp[0] = true;
for(int i = 1 ; i <= s.size() ; i++)
{
for(int j = 0 ; j < i; j++)
{
string word = s.substr(j,i-j);//其实位置,截取个数
//这里为什么需要dp[j]存在
if(mystring.find(word) != mystring.end() && dp[j]) dp[i] = true;
}
}
return dp[s.size( )];
}
};