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,說明不用累加了,因爲會“拖累”後邊求和的值。於是演變成了動態規劃問題。遞推公式就是
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;
}
}