53最大子序和

題目(連續的,區別於不連續的子序列)

https://leetcode-cn.com/problems/maximum-subarray/數組

動態規劃

動態規劃1(空間複雜度高)

使用二維數組spa

  1 2 3
1 1 3 6
2 0 2 5
3 0 0 3

 

1.  初始化對角線code

2.  計算距離爲2的和blog

3.  計算距離爲3的和leetcode

。。。get

計算出右上角的值table

程序:class

    public int maxSubArray(int[] nums) {
        if(nums.length == 0){
            return 0;
        }
        int len = nums.length;
        int[][] dp = new int[len][len];
        int max = Integer.MIN_VALUE;
        for(int i = 0 ;i < len ; i ++){
            dp[i][i] = nums[i];
            max = max > nums[i] ? max : nums[i];
        }

        for(int i = 1 ; i < len ; i++){
            for(int j = 0 ; i + j < len ; j ++){
                dp[j][i+j] = nums[j] + nums[i+j] + dp[j + 1][i + j -1];
                max = max > dp[j][i+j] ? max : dp[j][i+j];
            }
        }
        return max;
    }

 

動態規劃2(最佳解決)

dp[i] = max( dp[i - 1] + nums[i] , nums[i])程序

 public int maxSubArray(int[] nums) {
        if(nums == null && nums.length == 0){
            return 0;
        }
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int max = dp[0];

        for(int i = 1 ; i < nums.length ; i ++){
            int temp = nums[i] + dp[i-1];
            if (temp > nums[i]){
                dp[i] = temp;
            }else{
                dp[i] = nums[i];
            }
            max = Math.max(dp[i],max);
        }
        return max;
    }
相關文章
相關標籤/搜索