寒假刷题打卡第四天 | 贪心

  1. 股票最大收益|
    第i天的最大收益=max(第i-1天的最大收益,price[i]-min_price[i-1])(dp的思想)
    击败5%的用户-_-
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //双指针对于无序数组比较弱鸡
        int max_pro = 0;
        if(prices.empty())
            return 0;
        int buy = prices[0];
        for(int i=1;i<prices.size();i++)
        {
            int diff = prices[i] - buy;
            if(diff<0)
                buy = prices[i];
            else if(diff>max_pro)
                max_pro = diff;
        }
        return max_pro;

    }
};

代码优化一下:

        for (int price: prices) {
            maxprofit = max(maxprofit, price - minprice);
            minprice = min(price, minprice);
        }
  1. 股票最大收益||
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size()==0)
            return 0;
        int buy=prices[0],g_max=0,l_max = 0;//设置一个局部最大值和一个全局最大值
        // 类似于划分若干个互不重叠的区间
        for(int & p:prices)
        {
            int diff = p-buy;
            if(diff<0) //通过测试案例发现,这个条件判断是错的
            //比如[2,1,2,0,1]
                buy = p;
            else if(diff<l_max)
            {
                buy = p;
                g_max += l_max;
                l_max = 0;
            }
            else
                l_max = diff;
        }
        return g_max+l_max;
    }
};
  1. 种植小花花
    一开始的想法自然是如果数组中某个元素的上个元素为0、这个元素本身为0,且下个元素也为0,则n–。但是要单独讨论数组size为0 1 2 的情况。非常麻烦。
    解答区看见了神仙解法:

  2. 判断子序列
    哈哈哈,5min中不到,双指针,愉快地解出,而且几乎是双百

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int i=0,j=0;
        while(j<t.size()&&i<s.size())
        {
            if(t[j]==s[i])
            {
                i++;
                j++;
            }
            else
                j++;
        }
        return i>=s.size();
    }
};

官方解答还给出了dp的方法,太难了,不想看。

  1. 修改一个数成为非递减数列
    强行打上各种布丁后终于通过了:
class Solution {
public:
    bool checkPossibility(vector<int>& nums) {
        int flag=0; //记录修改的次数,应该小于2
        int i=0;
        for(;i<nums.size()-1&&flag<2;i++)
        {
            if(nums[i]<=nums[i+1])
                continue;
            else if(nums[i]>nums[i+1])
            {
                if(i==0 || nums[i+1]>=nums[i-1] || i==nums.size()-2) //布丁1[1,2,3,1]
                    flag++;
                else if(i<nums.size()-2 && nums[i+2]>nums[i]) //补丁2[1,2,3,1,4]
                    flag++;
                else
                    return false;
            }
        }
        return (flag<2);
    }
};

看了答案,发现我的解法还不赖~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值