动态规划
474. Ones and Zeroes
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
for(string str:strs){
int zeroNum = 0;
int oneNum = 0;
for(char c:str){
if(c == '0') zeroNum++;
else oneNum++;
}
for(int i=m; i>= zeroNum; i--){
for(int j=n; j>=oneNum; j--){
dp[i][j] = max(dp[i][j], dp[i-zeroNum][j-oneNum]+1);
}
}
}
return dp[m][n];
}
};
完全背包
518. Coin Change II
装满背包一般用到公式
dp[j] += dp[j - nums[i]]
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount+1, 0);
dp[0] = 1;
for(int i=0; i<coins.size(); i++){
for(int j=coins[i]; j<=amount; j++){
dp[j] += dp[j-coins[i]];
}
}
return dp[amount];
}
};
377. Combination Sum IV
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target+1, 0);
dp[0] = 1;
for(int i=0; i<= target; i++){
for(int j=0; j<nums.size(); j++){
if(i>=nums[j] && dp[i]< INT_MAX-dp[i-nums[j]])
dp[i] += dp[i-nums[j]];
}
}
return dp[target];
}
};
1. 如果求组合数就是外层for循环遍历物品,内层for遍历背包
如果求排列数就是外层for遍历背包,内层for循环遍历物品
2. 要加上限制条件防止runtime error
dp[i]< INT_MAX-dp[i-nums[j]]
这个是因为测试用例有想加大于4个字节的存在
哈希表
242. Valid Anagram
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26] = {0};
for(int i=0; i<s.size(); i++){
record[s[i]-'a']++;
}
for(int i=0; i<t.size(); i++){
record[t[i]-'a']--;
}
for(int i=0; i<26; i++){
if(record[i] != 0)
return false;
}
return true;
}
};
349. Intersection of Two Arrays
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> record;
vector<int> res;
for(int num:nums1){
record.insert(num);
}
for(int num2:nums2){
if(record.find(num2) != record.end()){
res.push_back(num2);
record.erase(num2);
}
}
return res;
}
};
1.如果题目中给了范围,就可以用数组(因为set要占用的空间更大)
2.可以把res也改成set这样就不用删除了
202. Happy Number
class Solution {
public:
bool isHappy(int n) {
unordered_set<int> record;
while(1){
int sum = getSum(n);
if(sum == 1)
return true;
if(record.find(sum) != record.end()){
return false;
}
record.insert(sum);
n = sum;
}
}
int getSum(int n){
int res = 0;
while(n>=1){
res += (n%10)*(n%10);
n /= 10;
}
return res;
}
};
1. Two Sum
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> map;
for(int i=0; i<nums.size(); i++){
auto iter = map.find(target-nums[i]);
if( iter != map.end()){
return {iter->second, i};
}
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};