Leetcode 121 Best Time to Buy and Sell Stock

public class S121 {
    public int maxProfit(int[] prices) {
        //TLE
/*      if(prices.length<2)
            return 0;
        int result = Integer.MIN_VALUE;        
        for(int i = prices.length-1;i>0;i--){
            prices[i] = prices[i]-prices[i-1];
        }
        for(int i = 1;i<prices.length-1;i++){
            int temp = 0;
            for(int j = i+1;j<prices.length;j++){
                temp += prices[j];
                if(temp>result)
                    result = temp;                
            }
        }
        return result;*/
        //分治法--来自算法导论最大子数组问题,AC but slow ,move findCrossMax() inside findMax() makes 3ms quicker
        //not best
/*        if(prices.length<2)
            return 0;      
        for(int i = prices.length-1;i>0;i--){
            prices[i] = prices[i]-prices[i-1];
        }
        int ret = findMax(prices,1,prices.length-1);
        return ret>0?ret:0;
    }
    public int findMax(int[] prices,int low,int high){
        if(low==high){
            return prices[low];
        }
        int left = findMax(prices,low,(low+high)/2);
        int right = findMax(prices,(low+high)/2+1,high);
//        int mid = findCrossMax(prices,low,high);
        int leftResult = Integer.MIN_VALUE;
        int rightResult = Integer.MIN_VALUE;
        int temp = 0;
        for(int i = (low+high)/2;i>low-1;i--){
            temp = temp+prices[i];
            if(temp>leftResult){
                leftResult = temp;
            }
        }
        temp = 0;
        for(int i = (low+high)/2+1;i<high+1;i++){
            temp = temp+prices[i];
            if(temp>rightResult){
                rightResult = temp;
            }
        }
        int mid = leftResult+rightResult;
        return Math.max(left, Math.max(right, mid));*/
        //better one from internet,omg!!!! i am stupid.
/*        if(prices.length<2)
            return 0;
        int curMin = prices[0];
        int ret = Integer.MIN_VALUE;
        for(int i = 1;i<prices.length;i++){
            curMin = Math.min(curMin, prices[i]);
            ret = Math.max(ret, prices[i]-curMin);
        }
        return ret;*/
        //由053kadane's algorithm得到启发,this is the best one
        if(prices.length<2)
            return 0;
        int ret = Integer.MIN_VALUE;
        int sum = 0;
        for(int i = prices.length-1;i>0;i--){
            prices[i] = prices[i]-prices[i-1];
            if(sum<0)
                sum = 0;
            sum += prices[i];
            if(sum>ret)
                ret = sum;
        }
        return ret>0?ret:0;

}
}
原文地址:https://www.cnblogs.com/fisherinbox/p/5272378.html