最大欄位和
阿新 • • 發佈:2021-06-21
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 14int 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 };