題目
給定一個整數數組 nums
,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
轉載鏈接 https://leetcode-cn.com/problems/maximum-subarray/
輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
解答
方法一:
思路是這樣的,最直接的思路,從第一個數開始,挨個往後加結果比最大值大,就把最大值更新,一直算到最後一個。
然後再依次從後邊一個數字開始。是個暴力方法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if (nums.size() == 1) {
return nums.front();
}
int max = nums[0];
//最大值是全局的量,每次循環不重置
for (int i = 0; i < nums.size(); i++) {
int data = nums[i];
//單個元素也判斷一下,避免遺漏一個元素是最大值的情況
if (data > max) {
max = data;
}
for (int j = i + 1; j < nums.size(); j++) {
data += nums[j];
if (data > max) {
max = data;
}
}
}
return max;
}
};
方法二:
假設在數組中的第n個下標滿足了最大的子序和,如果我們知道 n之前的n - 1個元素的最大子序和。那麼第n個下標的最大子序和
就是 n -1 下標的最大子序和和 + 下標n元素, 再和下標n元素比較得到的最大值。這樣的話一直遞推,座標 0 和座標1的最大子序和是很容易得到,依次往後計算,就可以得到結果了。
這裏f(n) 就代表座標n對應的最大子序和,每一個座標對應的最大子序和都有了,那麼這裏邊挑出最大的值就是整個數組的最大子序和了。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if (nums.size() == 1) {
return nums.front();
}
int max_data = nums[0];
int f_max = max_data;
for (int i = 1; i < nums.size(); i++) {
/// 第i個座標的之前的最大子序和
f_max = max(f_max + nums[i], nums[i]);
max_data = max(f_max, max_data);
}
return max_data;
}
};