1423. Maximum Points You Can Obtain from Cards
仅供自己学习
思路:
因为之前做了滑动窗口的题,可以用来求连续子串的最大值,最小值,那么是不是可以换一个方向,因为从两侧取值不连续,但我们可以取 在中部取连续的 s-k个数,并且求最小值,再用所有数字和减去最小值即可得到从两侧取到最大的值了。其中s为一系列数的个数。
1 class Solution { 2 public: 3 int maxScore(vector<int>& cardPoints, int k) { 4 int sum = accumulate(cardPoints.begin(),cardPoints.end(),0); 5 int s=cardPoints.size(); 6 if(s==k) return sum; 7 int len = s-k; 8 int mintemp =accumulate(cardPoints.begin(),cardPoints.begin()+len,0); 9 int minscore = mintemp; 10 for(int i=len;i<s;++i){ 11 mintemp = mintemp -cardPoints[i-len]+cardPoints[i]; 12 minscore = min(minscore,mintemp); 13 } 14 return sum -minscore; 15 16 } 17 };
还有一种方法就是,先计算出前K个数之和,在减去前K个的第 K-i个数再加上 第s-i个数,即最右侧没被取的数。每次取最大值
1 class Solution { 2 public: 3 int maxScore(vector<int>& cardPoints, int k) { 4 int presum = accumulate(cardPoints.begin(),cardPoints.begin()+k,0); 5 int minscore = presum; 6 int s = cardPoints.size(); 7 for(int i=0;i<k;++i){ 8 presum += cardPoints[s-i-1] - cardPoints[k-i-1]; 9 minscore = max(presum,minscore); 10 } 11 return minscore; 12 } 13 };

浙公网安备 33010602011771号