53. Maximum Subarray

題目 53. Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

1,枚舉
public class Solution {
    public int maxSubArray(int[] nums) {
        int len = nums.length;
        if(len == 0){
            return 0;
        }
        
        int max = nums[0];
        for(int i=0; i<len; i++){
            for(int j=i; j<len; j++){
                int sum = 0;
                for(int k=i; k<=j; k++){
                    sum += nums[k];
                }
                
                max = (max > sum ? max : sum);
            }
        }
        return max;
    }
}
時(shí)間復(fù)雜度:O(n3) , 空間復(fù)雜度:O(1)
2,枚舉優(yōu)化最內(nèi)層循環(huán)
分析:
因?yàn)楫?dāng)我們求得nums[i.....j]的時(shí)候, nums[i.....j-1]在上一步已經(jīng)計(jì)算過(guò)了,不必再重復(fù)計(jì)算-----sum(i,j) = sum(i,j-1)+nums(j)
public class Solution {
    public int maxSubArray(int[] nums) {
        int len = nums.length;
        if(len == 0){
            return 0;
        }
        
        int max = nums[0];
        for(int i=0; i<len; i++){
            int sum =0;
            for(int j=i; j<len; j++){
                sum += nums[j];
                max = (max > sum ? max : sum);
            }
        }
        return max;
    }
}
時(shí)間復(fù)雜度:O(n2) , 空間復(fù)雜度:O(1)
3,DP
狀態(tài)方程:
i=0, f[0]=nums(0), max=nums[0]
i>0, f[i]= nums[i] + f(i-1) > 0 ? f(i) : 0,
        max = (max > f[i] ? max : f[i]);
public class Solution {
    
    public int maxSubArray(int[] nums) {
        if(nums.length == 0){
            return 0;
        }
        
        int[] memory = new int[nums.length];

        memory[0] = nums[0] ;
        int max = memory[0];
        for(int i=1, len=nums.length; i<len; i++){
            
            memory[i] = nums[i] + (memory[i-1] > 0 ? memory[i-1] : 0); 
    
            max = (max > memory[i] ? max : memory[i]);
        }
       return max;
    }
}
時(shí)間復(fù)雜度:O(n) , 空間復(fù)雜度:O(n)
4,貪心
分析:
假設(shè)我們知道nums[0...i-1]最大和的情況下,怎么計(jì)算nums[0...i]的最大和呢?
如果nums[0...i-1]是負(fù)數(shù),那么我們認(rèn)為它對(duì)nums[0...i]的最大和沒(méi)有幫助,所以置nums[0...i-1]為0, nums[0...i]=nums[i]
如果nums[0...i-1]是大于等于0數(shù),那么我們認(rèn)為它對(duì)nums[0...i]的最大和有增加作用,那么nums[0...i]=nums[i]
public class Solution {
    
    public int maxSubArray(int[] nums) {
        if(nums.length == 0){
            return 0;
        }
        
        int max = Integer.MIN_VALUE;
        int sum = 0;
        
        for(int i=0, len=nums.length; i<len; i++){
            sum += nums[i];
            max = max > sum ? max : sum;
            
            if(sum < 0){
                sum = 0;
            }
        }
       return max;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容