1. 程式人生 > 其它 >最大欄位和

最大欄位和

https://leetcode-cn.com/problems/contiguous-sequence-lcci/

面試題 16.17. 連續數列

給定一個整數陣列,找出總和最大的連續數列,並返回總和。

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。

進階:

如果你已經實現複雜度為 O(n) 的解法,嘗試使用更為精妙的分治法求解。

問題思路

1.原陣列分解為左右陣列兩部分。

2.求解左右資料的最大和,存在第三種情況,最大和存在於兩個分段之間。

3.合併子問題的解。

程式碼設計思路

1.涉及最大值比較需要返回最大值,因此return資料型別為int,同時也為該子問題的ans。

2.通過設計遞迴,必須使遞迴區間不斷變小,因此使得mid = (l+r)/2。

3.面向最小遞迴區間設計遞迴出口,最小遞迴為(l, r)遞迴出口為 return nums[l](nums[r])。

虛擬碼:

// 遞迴出口

if l == r:

  return this;

mid = (l+r)/2;

l_max = re(l, mid); // 左段遞迴

r_max = re(mid+1, r); // 右段遞迴

lr_max = (sum_l, sum_r); // 直接計算cross的最大值

return max(l_max, r_max. lr_max);

 1 class Solution {
2 public: 3 4 int dfs(vector<int>& nums, int l, int r){ 5 if(l==r) 6 return nums[l]; 7 int mid_ = (l+r)/2; 8 // left 9 int l_max = dfs(nums, l, mid_); 10 // right 11 int r_max = dfs(nums, mid_+1, r); 12 13 // cross 14
int l_sum = INT_MIN; 15 int sum = 0; 16 // 左邊分為[0, mid] 右邊[mid+1, r] 17 for(int i=mid_; i>=l; i--){ 18 sum += nums[i]; 19 l_sum = max(sum, l_sum); 20 } 21 22 int r_sum = INT_MIN; 23 sum = 0; 24 for(int i=mid_+1; i<=r; i++){ 25 sum += nums[i]; 26 r_sum = max(sum, r_sum); 27 } 28 29 int max_ = max(l_sum+r_sum, max(l_max, r_max)); 30 31 32 return max_; 33 } 34 int maxSubArray(vector<int>& nums) { 35 if(nums.size()==0) 36 return 0; 37 return dfs(nums, 0, nums.size()-1); 38 } 39 };