LeetCode_122_买卖股票的最佳时机II

题目链接

解题思路

  • 贪心法
  • 由于股票的购买没有限制,因此整个问题等价于寻找x个不相交的区间 ( l i , r i ) (l_i,r_i) (li,ri)使得如下的等式最大化 ∑ i = 1 x a [ r i ] − a [ l i ] \sum_{i=1}^{x}{a[r_i]-a[l_i]} i=1xa[ri]a[li].其中 l i l_i li表示在第 l i l_i li天买入, r i r_i ri表示在第 r i r_i ri天卖出。
  • 对于区间 ( l i , r i ) (l_i,r_i) (li,ri)这一区间贡献的价值为 a [ r i ] − a [ l i ] a[r_i]-a[l_i] a[ri]a[li]。而 a [ r i ] − a [ l i ] = ( a [ r i ] − a [ r i − 1 ] ) + ( a [ r i − 1 ] − a [ r i − 2 ] ) + . . . + ( a [ l i + 1 ] − a [ l i ] ) a[r_i]-a[l_i]=(a[r_i]-a[r_i-1])+(a[r_i-1]-a[r_i-2])+...+(a[l_i+1]-a[l_i]) a[ri]a[li]=(a[ri]a[ri1])+(a[ri1]a[ri2])+...+(a[li+1]a[li]).因此问题可以简化为寻找x个长度为1的区间 ( l i , l i + 1 ) (l_i,l_i+1) (li,li+1),使得 ∑ i = 1 x a [ r i ] − a [ l i ] \sum_{i=1}^{x}{a[r_i]-a[l_i]} i=1xa[ri]a[li]最大
  • 因此最后的答案是 a n s = ∑ i = 1 n − 1 m a x ( 0 , a [ i ] − a [ i − 1 ] ) ans = \sum_{i=1}^{n-1}max{(0,a[i]-a[i-1])} ans=i=1n1max(0,a[i]a[i1])

AC代码

class Solution {
    public int maxProfit(int[] prices) {
        int ans = 0;
        int len = prices.length;
        for (int i = 1; i < len; i++)
            ans += Math.max(0, prices[i] - prices[i - 1]);
        return ans;        
    }
}

本地测试代码

package com.company;

public class Solution_122 {
    public static int maxProfit(int[] prices) {
        int ans = 0;
        int len = prices.length;
        for (int i = 1; i < len; i++)
            ans += Math.max(0, prices[i] - prices[i - 1]);
        return ans;
    }

    public static void main(String[] args) {
        System.out.println(maxProfit(new int[]{7, 1, 5, 3, 6, 4}));
        System.out.println(maxProfit(new int[]{1, 2, 3, 4, 5}));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值