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 };

 

posted @ 2021-02-06 11:46  Mrsdwang  阅读(82)  评论(0)    收藏  举报