优化网站使用体验,seo快速优化软件网站,万网影,制定一网站建设的市场定位的方案一、解题思路
设n表示数组的长度#xff0c;Min[i]是以nums[i]为开头组成的任意连续子数组中的和最小值#xff08;若所有子数组的和都大于0#xff0c;则Min[i]设为0。也就是说丢弃所有子数组#xff09;#xff1b;Max[i]是以nums[i]为开头组成的任意连续子数组中的和最…一、解题思路
设n表示数组的长度Min[i]是以nums[i]为开头组成的任意连续子数组中的和最小值若所有子数组的和都大于0则Min[i]设为0。也就是说丢弃所有子数组Max[i]是以nums[i]为开头组成的任意连续子数组中的和最大值若所有子数组的和都小于0则Max[i]设为0。
由此可以继续推算Min[i-1]和Max[i-1]
若nums[i-1]0Min[i-1]nums[i-1]Min[i] 若nums[i-1]Max[i]0Max[i-1]nums[i-1]Max[i] 否则Max[i-1]0
若nums[i-1]0Max[i-1]nums[i-1]Max[i] 若nums[i-1]Min[i]0Min[i-1]nums[i-1]Min[i] 否则Min[i-1]0
二、解释
Min[i]表示以nums[i]为开头连续相加得到的最小的负数。Min[i]一定小于或等于0
Max[i]表示以nums[i]为开头连续相加得到的最大的正数。Max[i]一定大于或等于0
sum是abs(Min[i])、abs(Max[i])中的最大值。
代码示例
class Solution {
public:int maxAbsoluteSum(vectorint nums) {int min,max,sum,n;nnums.size();sumabs(nums[n-1]);if(nums[n-1]0){minnums[n-1];max0;}else{min0;maxnums[n-1];}for(int in-2;i0;i--){if(nums[i]0){minnums[i];if(nums[i]max0){maxnums[i];}else{max0;}}else if(nums[i]0){if(nums[i]min0){minnums[i];}else{min0;}maxnums[i];}if(sumabs(min)){sumabs(min);}if(sumabs(max)){sumabs(max);}}return sum;}
};