2020-08-13刷题

  1. leetcode740删除与获得点数
    题型:动态规划
    难度:中等
    题目:给定一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
    代码:
class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        //这道题是打家劫舍的变形题。首先,找到nums里的最大值,创建数组vec,长度为nlen+1,下标为点数,内容是出现的个数。
        //那么对于每个元素来说,如果选择这个数,就是dp[i-2]+vec[i]*nums[i]
        //如果不选择这个数,就是dp[i-1]。选取两种情况最大值
        int nlen = nums.size();
        if(nlen <= 0) return 0;
        //找最大值
        int nMax = INT_MIN;
        for(int i=0;i<nlen;i++)
        {
            nMax = nMax<nums[i]?nums[i]:nMax;
        }
        //创建下标为点数的数组
        vector<int> vec(nMax+1,0);
        for(int i=0;i<nlen;i++)
        {
            vec[nums[i]]++;
        }
        vector<int> dp(nMax+1,0);
        if(nMax>=1)
            dp[1] = 1*vec[1];//1是点数,vec[1]是个数
        if(nMax >= 2)
            dp[2] = max(dp[1],2*vec[2]);
        for(int i=3;i<=nMax;i++)
        {
            dp[i] = max(dp[i-1],dp[i-2]+i*vec[i] );
        }
        return dp[nMax];//nMax即dp的长度
    }
};

参考:https://leetcode-cn.com/problems/delete-and-earn/solution/ru-guo-ni-li-jie-liao-da-jia-jie-she-zhe-ti-ni-ken/

  1. leetcode910最小差值2
    题型:贪心
    难度:中等
    题目:给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中。在此过程之后,我们得到一些数组 B。返回 B 的最大值和 B 的最小值之间可能存在的最小差值。
    代码:
class Solution {
public:
    int smallestRangeII(vector<int>& A, int K) {
        //注意:题目是得到一些数组B,求每个B里最大值和最小值的差值,最后取最小
        //遍历数组A,对于第i个数,让前面的数都加K,后面的都减K。
        //因为i前面的数加K一定都比这个数加K小,所以第一个数加K一定最小,如果取最小值,要用第一个数加K和第i个数-K比,取较小的。
        //因为i后面的数减K一定都比这个数减K大,所以最后一个数一定是最大值,用最后一个数减K和第i个数加K比较,取较大的。
        if(A.size() == 0) return 0;
        sort(A.begin(),A.end());
        int res = A[A.size()-1]-A[0];//如果元素都是一个方向增加,就是最大的结果
        int nMin;
        int nMax;
        for(int i=1;i<A.size();i++)
        {
            nMin = min(A[i]-K,A[0]+K);//i前面的元素都加K(不包括i)
            nMax = max(A[A.size()-1]-K,A[i-1]+K);//i及i后面的元素都K
            res = min(res,nMax-nMin);
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值