题目浅析

  • 想查看原题可以点击题目链接

  • 简单地说,就是给一个整型数组和一个数字 k,求按照某种方式下获取卡牌所得的最大点数。该方式为每次只能够取得最左或者最右的卡牌。

思路分享

代码解答(强烈建议自行解答后再看)

  • 逆向
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
int maxScore(vector<int>& cardPoints, int k) {
cout << reduce(cardPoints.begin(), cardPoints.begin()) << endl;
int win_size = cardPoints.size() - k;
if (win_size == 0) return reduce(cardPoints.begin(), cardPoints.end());

int min_sum = INT_MAX;
int cur_sum = 0;
int all_sum = 0;

for (int i = 0; i < cardPoints.size(); i++) {
all_sum += cardPoints[i];
cur_sum += cardPoints[i];

if (i < win_size-1) continue;

if (cur_sum < min_sum) min_sum = cur_sum;

cur_sum -= cardPoints[i-win_size+1];
}

return all_sum - min_sum;
}
};
  • 正向
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int maxScore(vector<int>& cardPoints, int k) {
int cards_size = cardPoints.size();
int n = cards_size - k;
int cur_sum = reduce(cardPoints.begin(), cardPoints.begin()+k);
int tmp_sum = cur_sum;
for (int i = 0; i < k; i++) {
tmp_sum += -cardPoints[k-1-i]+cardPoints[cards_size-1-i];
cur_sum = max(cur_sum, tmp_sum);
}
return cur_sum;
}
};