打家劫舍几道题

  1. 打家劫舍
class Solution {
public:
    int rob(vector<int>& nums) {
        int len = nums.size();
        if(len==0){
            return 0;
        }
        if(len==1){
            return nums[0];
        }
        vector<int> dp = vector<int>(len);
        dp[0] = nums[0];
        dp[1] = max(nums[0],nums[1]);
        for(int i =2;i< len ; i++){
            dp[i] = max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[len-1];
    }
};

打家劫舍2
难点在于怎么处理数组,这道题将数组转化为能使用动态规划的数组即可.
如果偷了下标为0的房屋,则要算到下标length-2为止的最大数量
如果偷了下标为1的房屋,则要算下标length-1为止的最大数量

class Solution {
public:
    int rob(vector<int>& nums) {
        int len = nums.size();
        if(len==1){
            return nums[0];
        }
        else if(len==2){
            return max(nums[0],nums[1]);
        }
        return max(robr(nums,0,len-2),robr(nums,1,len-1));
    }
    int robr(vector<int>& nums,int start,int end){
        int len = nums.size();
        int first = nums[start];
        int second = max(nums[start],nums[start+1]);
        for(int i = start+2;i<=end;i++){
            int t = second;
            second = max(first+nums[i],second);
            first = t;
        }
        return second;
/*
        vector<int> dp = vector<int>(end-start+1);
        dp[0] =nums[start];
        dp[1] = max (nums[start] ,nums[start+1]);
        int j = 2;
        for(int i =start+2;i<=end;i++){
            dp[j] = max(dp[j-2]+nums[i],dp[j-1]);
            j=j+1;
        }
        return dp[j-1];
*/
    }

};

740.删除并获得点数https://leetcode-cn.com/problems/delete-and-earn/
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于**nums[i] - 1 和 nums[i] + 1 **的元素。

开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
删元素等同于选了下标a,就不能选a-1,a+1;删了多少点数就等于获得了多少钱
因此dp[i]=dp[i-2]+sums[dp[i]]

class Solution {
private:
    int rob(vector<int> &nums) {
        int size = nums.size();
        int first = nums[0], second = max(nums[0], nums[1]);
        for (int i = 2; i < size; i++) {
            int temp = second;
            second = max(first + nums[i], second);
            first = temp;
        }
        return second;
    }

public:
    int deleteAndEarn(vector<int> &nums) {
        int maxVal = 0;
        for (int val : nums) {
            maxVal = max(maxVal, val);
        }
        //上面这段代码是算你要构造的sums的长度是从0开始的
        vector<int> sum(maxVal + 1);
        for (int val : nums) {
            sum[val] += val;
        }
        return rob(sum);
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/delete-and-earn/solution/shan-chu-bing-huo-de-dian-shu-by-leetcod-x1pu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2022-01-18 23:57  melt00  阅读(33)  评论(0编辑  收藏  举报