思路:方法一,前缀和,只不过这里是从右往左。因为你选中点i后,后面i+k*m个点你都必须选。那么我们直接从右往左间隔k-1个点开始求和。时间复杂度0(n),空间复杂度0(n)
class Solution {
public:
int maximumEnergy(vector<int>& energy, int k) {
int mx=INT_MIN;
int n=energy.size();
vector<int> v(n,0);
for(int i=n-1;i>=0;i--){
if(n-i<=k) v[i]=energy[i];
else{
v[i]=energy[i]+v[i+k];
}
mx=max(mx,v[i]);
}
return mx;
}
};
思路:方法二,这里改进了一下空间复杂度0(1)
class Solution {
public:
int maximumEnergy(vector<int>& energy, int k) {
int mx=INT_MIN;
int n=energy.size();
for(int i=n-k;i<n;i++){
int sum=0;
for(int j=i;j>=0;j-=k){
sum+=energy[j];
mx=max(mx,sum);
}
}
return mx;
}
};