leetcode做题总结,题目Best Time to Buy and Sell Stock 2012/10/30

本文介绍了一种优化后的算法,用于解决股票投资中的最大利润问题。通过引入变化量数组和动态规划思想,该算法能在O(n)时间内高效求解。详细解释了算法原理、步骤和代码实现,并提供了优化思路。

之前没想出来,今天忘了是看算法导论还是另一本算法书讲到了最大子序列,正好就拿这道题做例子,一种方法是二分递归两边的最大子序列,然后再合并,计算穿过中界线的最大序列进行递归求最大值。还有一种更好的方法是类似于GAS 那道题,求出变化量数组,然后相加,如果总和为负,则序列从新开始。这样只需O(n)的时间复杂度。


public int maxProfit(int[] prices) {
        int num = prices.length;
        if(num==0||num==1)return 0;
        int[] pr = new int[num-1];
        for(int i=0;i<num-1;i++){
            pr[i]=prices[i+1]-prices[i];
        }
        int max=0;
        int thi=0;
        for(int i=0;i<num-1;i++){
            thi=thi+pr[i];
            if(thi>max) max=thi;
            if(thi<0) thi=0;
        }
        return max;
    }

Update 2015/08/21: 思路同上,只是优化了一下


public class Solution {
    /**
     * @param prices: Given an integer array
     * @return: Maximum profit
     */
    public int maxProfit(int[] prices) {
        // write your code here
        int len = prices.length - 1;
        for (int i = 0; i< len; i++){
            prices[i] = prices[i + 1] - prices[i];
        }
        int global = 0;
        int local = 0;
        for (int i = 0; i< len; i++){
            local = local + prices[i];
            if (local < 0){
                local = 0;
            }
            global = Math.max(global, local);
        }
        global = Math.max(global, local);
        return global;
    }
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值