classSolution { public: intmaxSubarraySumCircular(vector<int> &nums) { int i, index, n = nums.size(); int max_sum = nums[0]; int sum = nums[0]; vector<int> dp_kadane(n);
dp_kadane[0] = nums[0]; for (i = 1; i < n; i++) { // case1 : 0<=start<=end<n dp_kadane[i] = std::max(dp_kadane[i - 1] + nums[i], nums[i]); max_sum = std::max(max_sum, dp_kadane[i]); sum += nums[i]; } // case2: [0,end] [start, n-1] // vector<int> suffix(n); // suffix[n - 1] = nums[n - 1]; // for (i = n - 2; i >= 0; i--) { // suffix[i] = suffix[i + 1] + nums[i]; // }
// vector<int> prefix(n); // prefix[0] = nums[0]; // for (i = 1; i < n; i++) { // prefix[i] = prefix[i - 1] + nums[i]; // } vector<int> dp_min_kadane(n); dp_min_kadane[0] = nums[0]; int min_sum = nums[0]; for (i = 1; i < n; i++) { dp_min_kadane[i] = std::min(dp_min_kadane[i - 1] + nums[i], nums[i]); min_sum = std::min(min_sum, dp_min_kadane[i]); } if (min_sum == sum) { return max_sum; }
classSolution { public: intmaxSubarraySumCircular(vector<int> &nums) { int i, index, n = nums.size(); int max_sum = nums[0], min_sum = nums[0]; int sum = nums[0]; vector<int> dp_kadane(n); vector<int> dp_min_kadane(n);