遇到环形问题一般有两种考虑方法:
1.破环成链
2.分为数组中间部分和数组两边部分分别考虑
本题采用第二种考虑方法,将原数组分为中间部分和两边部分分别考虑。中间部分即为子数组最大和,两边部分计总和减去中间部分最小和。
class Solution { public: int maxSubarraySumCircular(vector<int>& nums) { int n= nums.size(); int sum = nums[0]; vector<int> f(nums); vector<int> g(nums); for(int i = 1; i < n; i ++ ) { f[i] = max(nums[i], f[i - 1] + nums[i]); g[i] = min(nums[i], g[i - 1] + nums[i]); sum += nums[i]; } int maxv = *max_element(f.begin(), f.end()); int minv = *min_element(g.begin(), g.end()); return max(maxv, sum - minv == 0 ? maxv: sum - minv); } };
标签:nums,--,sum,maxv,int,918,数组,LeetCode,minv From: https://www.cnblogs.com/zk6696/p/17547117.html