1423. 可获得的最大点数
思路一:贪心(错误)
如果每次取前后最大的一个数字,则不一定最优秀。如[1,100,3,2] k=2,如果每次取前后最大的一个元素,则结果为3+2 = 5,但是实际结果是1+100=101
class Solution {
public int maxScore(int[] cardPoints, int k) {
int res = 0;
int start = 0;
int end = cardPoints.length-1;
while(k>0){
k--;
if(cardPoints[start]>cardPoints[end])
res+=cardPoints[start++];
else
res+=cardPoints[end--];
}
return res;
}
}
思路二:滑动窗口法
我们可以从结果上来考虑,我们最后的结果是A,B,C,其中 A ∪ C A\cup C A∪C一共有k个元素,我们希望它最大,又因为 A ∪ B ∪ C A\cup B\cup C A∪B∪C的和是一定的,所以我们实际上只要用总和减去B的和就可以得到A+C的和了。
class Solution {
public int maxScore(int[] cardPoints, int k) {
int res = 0; // 记录n-k个的元素的值
int sum = 0;
int n = cardPoints.length;
for(int i = 0;i<n;i++){
sum+=cardPoints[i];
if(i<(n-k))
res+=cardPoints[i]; // [0,n-k-1]
}
int ans = sum-res;
// i 是区间的终止
for(int i=n-k;i<cardPoints.length;i++){
res = res+cardPoints[i]-cardPoints[i-n+k];
ans = Math.max(ans,sum-res);
}
return ans;
}
}