基于买卖股票的最佳时机Ⅰ的改造(非贪心&贪心)两方法

Problem: 122. 买卖股票的最佳时机 II

思路

非贪心:

  • 每天的股价有三种状态,即[谷点]、[上升]、[降低],但在此题上和原版买卖股票leetcode121不一样的是:
  • 我们可以不停的买卖也就是说[谷点]和[下降]状态是[等同]的
  • [谷点+下降]的时候不仅需要重置最小值,结果值还要加上上一段区间
  • [上升]的时候需要持续不断的更新区间值,但有个[例外]:如果最后一次区间是上升就永远都不会被下一次下降所收回,所以需要额外注意是否为最后一次收集

贪心:

  • 基于目前情况做最佳选择,不考虑后果
  • 即不断的卖出股票,直到遇到股价降低,此时重新开始计算即可

解题方法

见注释

复杂度

Code

非贪心:

public static class Solution {
    public int maxProfit(int[] nums) {
        int max = 0;
        int min = Integer.MAX_VALUE;
        int result = 0;
        for (int i = 0; i < nums.length; i++) {
            //股价上升
            if(nums[i]-min >= max){
                //如果股价还在上升则更新最大区间
                max = nums[i]-min;
                //如果最后一次收集是持续增加的就需要手动收集一次
                if(i==nums.length-1){
                    result += max;
                }
            }else{
                //股价降低

                //加上上一段区间
                result += max;
                //重置区间值,准备重新计数
                max = 0;
                //重置最小值,准备重新计数
                min = nums[i];
            }
        }
        return result==0?max:result;
    }
}

贪心:

public int maxProfit_2(int[] nums) {
    int result = 0;
    for (int i = 0; i < nums.length-1; i++) {
        if(nums[i] < nums[i+1]) result += nums[i+1] - nums[i];
    }
    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值