-
Notifications
You must be signed in to change notification settings - Fork 0
/
798.得分最高的最小轮调.cpp
92 lines (89 loc) · 2.76 KB
/
798.得分最高的最小轮调.cpp
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
* @lc app=leetcode.cn id=798 lang=cpp
*
* [798] 得分最高的最小轮调
*
* https://leetcode-cn.com/problems/smallest-rotation-with-highest-score/description/
*
* algorithms
* Hard (40.33%)
* Likes: 40
* Dislikes: 0
* Total Accepted: 619
* Total Submissions: 1.5K
* Testcase Example: '[2,3,1,4,0]'
*
* 给定一个数组 A,我们可以将它按一个非负整数 K 进行轮调,这样可以使数组变为 A[K], A[K+1], A{K+2], ... A[A.length
* - 1], A[0], A[1], ..., A[K-1] 的形式。此后,任何值小于或等于其索引的项都可以记作一分。
*
* 例如,如果数组为 [2, 4, 1, 3, 0],我们按 K = 2 进行轮调后,它将变成 [1, 3, 0, 2, 4]。这将记作 3 分,因为 1
* > 0 [no points], 3 > 1 [no points], 0 <= 2 [one point], 2 <= 3 [one point],
* 4 <= 4 [one point]。
*
* 在所有可能的轮调中,返回我们所能得到的最高分数对应的轮调索引 K。如果有多个答案,返回满足条件的最小的索引 K。
*
*
*
* 示例 1:
*
* 输入:[2, 3, 1, 4, 0]
* 输出:3
* 解释:
* 下面列出了每个 K 的得分:
* K = 0, A = [2,3,1,4,0], score 2
* K = 1, A = [3,1,4,0,2], score 3
* K = 2, A = [1,4,0,2,3], score 3
* K = 3, A = [4,0,2,3,1], score 4
* K = 4, A = [0,2,3,1,4], score 3
* 所以我们应当选择 K = 3,得分最高。
*
* 示例 2:
*
* 输入:[1, 3, 0, 2, 4]
* 输出:0
* 解释:
* A 无论怎么变化总是有 3 分。
* 所以我们将选择最小的 K,即 0。
*
*
*
*
* 提示:
*
*
* A 的长度最大为 20000。
* A[i] 的取值范围是 [0, A.length]。
*
* 先记录A中每个数A[i]在第几轮时,会得到A[i]所处位置的索引和A[i]的值相等
* 即在第(i - A[i] + len) % len轮时,A[i]所处位置的索引和A[i]相等
* 那么在下一轮也就是第(i - A[i] + 1 + len) % len轮,这个值比索引小,会导致得分减少一分
*
* 所以可以以第0轮的得分为基准(得分是多少无所谓),判断每一轮损失的得分是多少。
*
* 注意:每次第0位置轮调到len-1位置时,得分都加1(因为A[i] <=length)
*/
// @lc code=start
#include <vector>
using namespace std;
class Solution {
public:
int bestRotation(vector<int>& A) {
int len = A.size();
vector<int> change(len, 0);
for(int i = 0; i < len; ++i){
change[(i - A[i] + 1 + len) % len] -= 1;
}
int max_index = 0;
int score = 0;
int maxScore = score;
for(int i = 1; i < len; ++i){
score = score + change[i] + 1;
if(score > maxScore){
maxScore = score;
max_index = i;
}
}
return max_index;
}
};
// @lc code=end