題目 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;
}
}