题目链接:1423. 可获得的最大点数(中等)
算法原理:
解法:滑动窗口
击败88.38%
时间复杂度O(N)
由于每次只从两侧选取最大值,故中间部分必然连续
问题由此可转化成:
窗口大小:n-k(n是数组长度),找窗口内最小值,返回值:总和-窗口内最小和
其余跟C.滑动窗口------1456. 定长子串中元音的最大数目(模板题)一样
**小细节:**当窗口大小==0时,left会越界访问,所以直接返回数组内所有元素的和即可
注:此题不能贪心
javaclass Solution { public int maxScore(int[] nums, int k) { int n=nums.length; int ret=0,len=0; int left=0,right=n-1; while(left<=right){ if(nums[left]>=nums[right]) ret+=nums[left++]; else ret+=nums[right--]; len++; if(len==k) return ret; } return 0; } }当案例是[1,2,3,4,5,6,1]时贪左边,会导致选左边,右边同理
JAVA代码:
java
class Solution {
public int maxScore(int[] nums, int kk) {
//解法:滑动窗口
//问题转换:窗口长度:n-k,找窗口内的最小值
int n=nums.length;
int k=n-kk,ret=0x3f3f3f3f,sum=0;
int total=0;
for(int x:nums) total+=x;
if(k==0) return total;
for(int right=0;right<n;right++){
int left=right-k+1;
//进窗口
sum+=nums[right];
if(left<0) continue;
//更新
ret=Math.min(ret,sum);
//出窗口
sum-=nums[left];
}
return total-ret;
}
}