原題**:
42. 最大子陣列 ii
討論區
給定乙個整數陣列,找出兩個 不重疊 子陣列使得它們的和最大。
每個子陣列的數字在陣列中的位置應該是連續的。
返回最大的和。
注意事項
子陣列最少包含乙個數
您在真實的面試中是否遇到過這個題?
yes樣例給出陣列[1, 3, -1, 2, -1, 2]
這兩個子陣列分別為[1, 3]
和[2, -1, 2]
或者[1, 3, -1, 2]
和[2]
,它們的最大和都是7
挑戰
要求時間複雜度為 o(n)
標籤
子陣列前後遍歷
列舉法陣列
貪心思路:
對這種求兩個陣列不重疊區間的問題我是真的非常容易大腦宕機,一上來就是確定兩個區間的邊界,不重疊時 end1 < begin2 --------一把心塞淚,這樣走下去當然是想不出解法的。
然後想到一種比較笨的解法,就是遍歷nums,每次遍歷陣列分為左側部分(0~i)和右側部分(i+1~n-1),再分別求左側部分最大子陣列和與右側部分最大子陣列和(又是兩個for迴圈),如果左右兩個最大子陣列和大於初始設定的sum(int型的最小值),就更新sum。這樣在編譯器執行正常,但是提交**到lintcode上就超出時間限制了。時間複雜度是o(n*n)。
想了下這個方法的主要問題是重複計算,在網上看了別人的答案後恍然大悟,可以用陣列將每次的運算結果儲存起來,即:
定義兩個陣列left與right,與nums等長,分別記錄每個位置左側最大子陣列和與右側最大子陣列和;
從左往右遍歷,計算i左側部分的最大子陣列和left【i】;
再從右往左遍歷,計算i右側部分的最大子陣列和right【i】;
遍歷left與right,left[k]+right[k+1]表示在第k位拆分陣列,得到其子陣列的和,找到最大值return出去就可以了。
參考:ac**:
classsolution
int n=nums.size();
vector
left(n,0
); vector
right(n,0
);
int maxsum1=nums[0],sum1=0
;
int maxsum2=nums[n-1],sum2=0
;
int i=0,j=n-1
;
for (;i)
if (sum1<0
)
left[i]=maxsum1;
}for (;j>=0;j--)
if (sum2<0
)
right[j]=maxsum2;
}int sum=left[0]+right[1
];
for (int k=1;k1;k++)//
k=n-1時left為整個nums的最大子陣列和,不符合子陣列不重疊要求,且right下標超出範圍;
}return
sum;
}};
還可以直接計算 0~k 與 k+1~n-1 部分的最大子陣列和,修改**如下:
classsolution
int n=nums.size();
vector
left(n,0
); vector
right(n,0
);
int maxsum1=nums[0],sum1=0
;
int maxsum2=nums[n-1],sum2=0
;
int i=0,j=n-1
;
for (;i//
計算0~k的最大子陣列和;
if (sum1<0
)
left[i]=maxsum1;
}for (;j>0;j--)//
計算k+1~n-1的最大子陣列和;
if (sum2<0
)
right[j-1]=maxsum2;
}int sum=left[0]+right[0
];
for (int k=1;k1;k++)//
k=n-1時left為整個nums的最大子陣列和,不符合子陣列不重疊要求;
}return
sum;
}};
42 最大子陣列差
2017.9.22 與最大子陣列的思路類似,只不多要尋找部分和的最大值和最小值 然後再進行比較。public class solution if size 2 int leftmax new int size int leftmin new int size leftmax 0 nums 0 lef...
LintCode 42 最大子陣列 II
給定乙個整數陣列,找出兩個 不重疊子陣列使得它們的和最大。每個子陣列的數字在陣列中的位置應該是連續的。返回最大的和。public class solution else if tmp max leftarray i max int rightarray new int nums.size max i...
lintcode練習 42 最大子陣列 II
給定乙個整數陣列,找出兩個 不重疊 子陣列使得它們的和最大。每個子陣列的數字在陣列中的位置應該是連續的。返回最大的和。給出陣列 1,3,1,2,1,2 這兩個子陣列分別為 1,3 和 2,1,2 或者 1,3,1,2 和 2 它們的最大和都是7 要求時間複雜度為 o n 子陣列最少包含乙個數 cla...