File tree 6 files changed +271
-2
lines changed
solution/0700-0799/0798.Smallest Rotation with Highest Score
6 files changed +271
-2
lines changed Original file line number Diff line number Diff line change @@ -49,22 +49,117 @@ A 无论怎么变化总是有 3 分。
49
49
50
50
<!-- 这里可写通用的实现逻辑 -->
51
51
52
+ 差分数组。
53
+
54
+ 对于每个数,都有一个固定的 k 生效区间。我们先利用差分,预处理每个数的 k 生效区间。有最多个数能覆盖到的 k 即是答案。
55
+
52
56
<!-- tabs:start -->
53
57
54
58
### ** Python3**
55
59
56
60
<!-- 这里可写当前语言的特殊实现逻辑 -->
57
61
58
62
``` python
59
-
63
+ class Solution :
64
+ def bestRotation (self , nums : List[int ]) -> int :
65
+ n = len (nums)
66
+ mx, ans = - 1 , n
67
+ d = [0 ] * n
68
+ for i, v in enumerate (nums):
69
+ l, r = (i + 1 ) % n, (n + i + 1 - v) % n
70
+ d[l] += 1
71
+ d[r] -= 1
72
+ s = 0
73
+ for k, t in enumerate (d):
74
+ s += t
75
+ if s > mx:
76
+ mx = s
77
+ ans = k
78
+ return ans
60
79
```
61
80
62
81
### ** Java**
63
82
64
83
<!-- 这里可写当前语言的特殊实现逻辑 -->
65
84
66
85
``` java
86
+ class Solution {
87
+ public int bestRotation (int [] nums ) {
88
+ int n = nums. length;
89
+ int [] d = new int [n];
90
+ for (int i = 0 ; i < n; ++ i) {
91
+ int l = (i + 1 ) % n;
92
+ int r = (n + i + 1 - nums[i]) % n;
93
+ ++ d[l];
94
+ -- d[r];
95
+ }
96
+ int mx = - 1 ;
97
+ int s = 0 ;
98
+ int ans = n;
99
+ for (int k = 0 ; k < n; ++ k) {
100
+ s += d[k];
101
+ if (s > mx) {
102
+ mx = s;
103
+ ans = k;
104
+ }
105
+ }
106
+ return ans;
107
+ }
108
+ }
109
+ ```
110
+
111
+ ### ** C++**
112
+
113
+ ``` cpp
114
+ class Solution {
115
+ public:
116
+ int bestRotation(vector<int >& nums) {
117
+ int n = nums.size();
118
+ int mx = -1, ans = n;
119
+ vector<int > d(n);
120
+ for (int i = 0; i < n; ++i)
121
+ {
122
+ int l = (i + 1) % n;
123
+ int r = (n + i + 1 - nums[ i] ) % n;
124
+ ++d[ l] ;
125
+ --d[ r] ;
126
+ }
127
+ int s = 0;
128
+ for (int k = 0; k < n; ++k)
129
+ {
130
+ s += d[ k] ;
131
+ if (s > mx)
132
+ {
133
+ mx = s;
134
+ ans = k;
135
+ }
136
+ }
137
+ return ans;
138
+ }
139
+ };
140
+ ```
67
141
142
+ ### **Go**
143
+
144
+ ```go
145
+ func bestRotation(nums []int) int {
146
+ n := len(nums)
147
+ d := make([]int, n)
148
+ for i, v := range nums {
149
+ l, r := (i+1)%n, (n+i+1-v)%n
150
+ d[l]++
151
+ d[r]--
152
+ }
153
+ mx, ans, s := -1, n, 0
154
+ for k, t := range d {
155
+ s += t
156
+ if s > mx {
157
+ mx = s
158
+ ans = k
159
+ }
160
+ }
161
+ return ans
162
+ }
68
163
```
69
164
70
165
### ** ...**
Original file line number Diff line number Diff line change @@ -66,13 +66,104 @@ So we will choose the smallest K, which is 0.
66
66
### ** Python3**
67
67
68
68
``` python
69
-
69
+ class Solution :
70
+ def bestRotation (self , nums : List[int ]) -> int :
71
+ n = len (nums)
72
+ mx, ans = - 1 , n
73
+ d = [0 ] * n
74
+ for i, v in enumerate (nums):
75
+ l, r = (i + 1 ) % n, (n + i + 1 - v) % n
76
+ d[l] += 1
77
+ d[r] -= 1
78
+ s = 0
79
+ for k, t in enumerate (d):
80
+ s += t
81
+ if s > mx:
82
+ mx = s
83
+ ans = k
84
+ return ans
70
85
```
71
86
72
87
### ** Java**
73
88
74
89
``` java
90
+ class Solution {
91
+ public int bestRotation (int [] nums ) {
92
+ int n = nums. length;
93
+ int [] d = new int [n];
94
+ for (int i = 0 ; i < n; ++ i) {
95
+ int l = (i + 1 ) % n;
96
+ int r = (n + i + 1 - nums[i]) % n;
97
+ ++ d[l];
98
+ -- d[r];
99
+ }
100
+ int mx = - 1 ;
101
+ int s = 0 ;
102
+ int ans = n;
103
+ for (int k = 0 ; k < n; ++ k) {
104
+ s += d[k];
105
+ if (s > mx) {
106
+ mx = s;
107
+ ans = k;
108
+ }
109
+ }
110
+ return ans;
111
+ }
112
+ }
113
+ ```
114
+
115
+ ### ** C++**
116
+
117
+ ``` cpp
118
+ class Solution {
119
+ public:
120
+ int bestRotation(vector<int >& nums) {
121
+ int n = nums.size();
122
+ int mx = -1, ans = n;
123
+ vector<int > d(n);
124
+ for (int i = 0; i < n; ++i)
125
+ {
126
+ int l = (i + 1) % n;
127
+ int r = (n + i + 1 - nums[ i] ) % n;
128
+ ++d[ l] ;
129
+ --d[ r] ;
130
+ }
131
+ int s = 0;
132
+ for (int k = 0; k < n; ++k)
133
+ {
134
+ s += d[ k] ;
135
+ if (s > mx)
136
+ {
137
+ mx = s;
138
+ ans = k;
139
+ }
140
+ }
141
+ return ans;
142
+ }
143
+ };
144
+ ```
75
145
146
+ ### **Go**
147
+
148
+ ```go
149
+ func bestRotation(nums []int) int {
150
+ n := len(nums)
151
+ d := make([]int, n)
152
+ for i, v := range nums {
153
+ l, r := (i+1)%n, (n+i+1-v)%n
154
+ d[l]++
155
+ d[r]--
156
+ }
157
+ mx, ans, s := -1, n, 0
158
+ for k, t := range d {
159
+ s += t
160
+ if s > mx {
161
+ mx = s
162
+ ans = k
163
+ }
164
+ }
165
+ return ans
166
+ }
76
167
```
77
168
78
169
### ** ...**
Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ public:
3
+ int bestRotation (vector<int >& nums) {
4
+ int n = nums.size ();
5
+ int mx = -1 , ans = n;
6
+ vector<int > d (n);
7
+ for (int i = 0 ; i < n; ++i)
8
+ {
9
+ int l = (i + 1 ) % n;
10
+ int r = (n + i + 1 - nums[i]) % n;
11
+ ++d[l];
12
+ --d[r];
13
+ }
14
+ int s = 0 ;
15
+ for (int k = 0 ; k < n; ++k)
16
+ {
17
+ s += d[k];
18
+ if (s > mx)
19
+ {
20
+ mx = s;
21
+ ans = k;
22
+ }
23
+ }
24
+ return ans;
25
+ }
26
+ };
Original file line number Diff line number Diff line change
1
+ func bestRotation (nums []int ) int {
2
+ n := len (nums )
3
+ d := make ([]int , n )
4
+ for i , v := range nums {
5
+ l , r := (i + 1 )% n , (n + i + 1 - v )% n
6
+ d [l ]++
7
+ d [r ]--
8
+ }
9
+ mx , ans , s := - 1 , n , 0
10
+ for k , t := range d {
11
+ s += t
12
+ if s > mx {
13
+ mx = s
14
+ ans = k
15
+ }
16
+ }
17
+ return ans
18
+ }
Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ public int bestRotation (int [] nums ) {
3
+ int n = nums .length ;
4
+ int [] d = new int [n ];
5
+ for (int i = 0 ; i < n ; ++i ) {
6
+ int l = (i + 1 ) % n ;
7
+ int r = (n + i + 1 - nums [i ]) % n ;
8
+ ++d [l ];
9
+ --d [r ];
10
+ }
11
+ int mx = -1 ;
12
+ int s = 0 ;
13
+ int ans = n ;
14
+ for (int k = 0 ; k < n ; ++k ) {
15
+ s += d [k ];
16
+ if (s > mx ) {
17
+ mx = s ;
18
+ ans = k ;
19
+ }
20
+ }
21
+ return ans ;
22
+ }
23
+ }
Original file line number Diff line number Diff line change
1
+ class Solution :
2
+ def bestRotation (self , nums : List [int ]) -> int :
3
+ n = len (nums )
4
+ mx , ans = - 1 , n
5
+ d = [0 ] * n
6
+ for i , v in enumerate (nums ):
7
+ l , r = (i + 1 ) % n , (n + i + 1 - v ) % n
8
+ d [l ] += 1
9
+ d [r ] -= 1
10
+ s = 0
11
+ for k , t in enumerate (d ):
12
+ s += t
13
+ if s > mx :
14
+ mx = s
15
+ ans = k
16
+ return ans
You can’t perform that action at this time.
0 commit comments