LeetCode_Maximum Subarray | Maximum Product Subarray

Maximum Subarray

一、題目描述

這裏寫圖片描述


就是求一個數組的最大子序列

二、思路及代碼

首先我們想到暴力破解

public class Solution {
    public int maxSubArray(int[] nums) {
       int sum = Integer.MIN_VALUE;
       for(int i=0; i<nums.length; i++)
           for(int j=i+1; j<nums.length; j++) 
               sum = Math.min(nums[i]+nums[j], sum);

       return sum;
    }
}

果然TLE了,於是要找到合適的時間複雜度。所以再尋找時間複雜度小於N平方的。

所以我們想到既然要求最大子序列,那麼我們在掃面累加數組元素時,判斷之前的元素是否小於0,如果小於0,說明不用累加了,因爲會“拖累”後邊求和的值。於是演變成了動態規劃問題。遞推公式就是maxSum=Math.max(maxSum,curSumi) 。其中 curSumi 就是到第 i 個數字時最大的和值。

public class Solution {
    public int maxSubArray(int[] nums) {
       int sum = nums[0], maxSum = nums[0];
       for(int i=1; i<nums.length; i++) {
           if(sum < 0) sum = 0; //判斷之前的sum是否可以利用
           sum += nums[i];
           maxSum = Math.max(sum, maxSum);
       }
       return maxSum;
    }
}

Maximum Product Subarray

一、題目描述

這裏寫圖片描述

二、代碼及思路

思路與上道題有所不同,這裏要求是求乘積,那麼乘積有個最簡單的性質:負負得正;

那麼如果套用上面那道題的思路,當前最小值如果是負值,如果下一個也是負值,就很可能成爲一個很大的正值。所以我們這裏需要兩個保存當前最小值和最大值的局部變量。

public class Solution {
    public int maxProduct(int[] nums) {
        int localMaxProduct = nums[0], localMinProduct = nums[0], maxProduct = nums[0]; 

        for(int i=1; i<nums.length; i++) {
            int copy_localMinProduct = localMinProduct;
            localMinProduct = Math.min(Math.min(nums[i]*copy_localMinProduct, nums[i]*localMaxProduct), nums[i]);
            localMaxProduct = Math.max(Math.max(nums[i]*copy_localMinProduct, nums[i]*localMaxProduct), nums[i]);
            maxProduct = Math.max(localMaxProduct, maxProduct);
        }
        return maxProduct;
    }
}
發佈了54 篇原創文章 · 獲贊 26 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章