自己想了个思路,选择排序加一个二数组记录坐标,可惜这么做只能得到局部最优解,得不到全局最优,因此看了官方题解的思路,滑动窗口和DP;滑动窗口更好理解,且挺适合这种多个出发点记录最大子数组之和的
Go版本:
func maxSumOfThreeSubarrays(nums []int, k int) []int {
// 滑动窗口 求解多个最大和
var sum1,sum2,sum3 int;
var max_sum1,max_sum2,max_sum3 int;
var max_sum1_idx,max_sum2_idx1,max_sum2_idx2 int;
var ans []int;
n:=len(nums);
for i:=2*k;i<n;i++{
sum1+=nums[i-k*2];
sum2+=nums[i-k];
sum3+=nums[i];
if i>=k*3-1{
if sum1>max_sum1{
max_sum1=sum1;
max_sum1_idx=i-k*3+1;
}
if sum2+max_sum1>max_sum2{
max_sum2,max_sum2_idx1,max_sum2_idx2=sum2+max_sum1,max_sum1_idx,i-k*2+1;
}
if sum3+max_sum2>max_sum3{
max_sum3=sum3+max_sum2;
ans=[]int{max_sum2_idx1,max_sum2_idx2,i-k+1}
}
sum1-=nums[i-k*3+1];
sum2-=nums[i-k*2+1];
sum3-=nums[i-k+1];
}
}
return ans;
}
网友评论