这题我觉得很难,是子数组的最大和的进阶版,环形的条件让很多人不知所措。
Kadane算法吗,好像是这样叫的,实际上就是动态规划。
结合了一个小小的精妙的构思。内环+外环。
内环就是该数组内部物理连续的数据,可以用子数组最大和的方式解决,而外环,依然可以用子数组最大和的方式解决,只需要将最大变成最小,环上数据之和减去最小,即可得到最大。
需要有个小小的修改,那就是如果这个最小连续子数组恰巧等于整个环,那么最大值不是相减的结果0,而把它置为环上数据之和。这样在与内环最大值的比较中,一定不会被选择。(有点多此一举,可以直接返回内环最大值)
int maxSubarraySum(int* nums, int numsSize){
int dp[numsSize], i, max;
max = dp[0] = nums[0];
for(i = 1; i < numsSize; ++i){
dp[i] = nums[i] + fmax(dp[i-1], 0);
max = fmax(dp[i], max);
}
return max;
}
int minSubarrrySum(int* nums, int numsSize){
int dp[numsSize], i, min;
min = dp[0] = nums[0];
for(i = 1; i < numsSize; ++i){
dp[i] = nums[i] + fmin(dp[i-1], 0);
min = fmin(dp[i], min);
}
return min;
}
int maxSubarraySumCircular(int* nums, int numsSize){
int max1 = maxSubarraySum(nums, numsSize);
int sum = 0;
int i;
for(i = 0; i < numsSize; ++i){
sum += nums[i];
}
int max2 = sum - minSubarrrySum(nums, numsSize);
if(max2 == 0) max2 = sum;
int max = fmax(max1, max2);
return max;
}