Leetcode 动态规划 474 518 377 哈希表 242 349 202 1

动态规划

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 {};
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值