leetcode:918. 环形子数组的最大和(dp)

题目:

在这里插入图片描述

分析:

leetcode官方题解:

思路一:

分包含循环处和不包含两种:
不包含:就是平常的连续数组和。
包含:就是必包含两端,然后我觉得是nlogn就可得出。两重循环的解法。

思路二:

对于此题,循环的就是复制数组再加到其后,保障下标I,j的差小于N即可。
对题解的优先队列不太理解。

思路三:

就是找连续的最小值即可。
在这里插入图片描述
即 第一种的双区间,我们找到1,len()-2之间的最小值即可。

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
 vector<int> A;
 if(A.size()==0) return 0;
 if(A.size()==1) return A[0];
 if(A.size()==2) return max(max(A[0],A[1]),A[0]+A[1]);
 //包含第i项的最大值
 vector<int> A1=A;
 int maxx=A[0];
 for(int i=1;i<A.size();i++)
 {
  A1[i]=max(A1[i-1],0)+A[i];
  maxx=max(maxx,A1[i]);
 }
 int sum=accumulate(A.begin(),A.end(),0);
 int minn=A[1];
 A1[1]=A[1];
 if(A.size()!=3) 
 for(int i=2;i<A.size()-1;i++)
 {
  A1[i]=min(0,A1[i-1])+A[i];
  minn=min(A1[i],minn);
 }
 return max(sum-minn,maxx);
}
原创文章 397 获赞 284 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/105717362