Giả sử chúng ta có một mảng A, chúng ta có thể xoay nó theo K để mảng trở thành A [K], A [K + 1], A {K + 2], ... A [A.length - 1], A [0], A [1], ..., A [K-1]. Khi đó, bất kỳ mục nhập nào nhỏ hơn hoặc bằng chỉ số của chúng đều có giá trị 1 điểm.
Vì vậy, ví dụ, chúng ta có một mảng [2, 4, 1, 3, 0], và chúng ta xoay K =2, nó sẽ trở thành [1, 3, 0, 2, 4]. Điều này có giá trị 3 điểm vì 1> 0 [không đạt được điểm], 3> 1 [không đạt được điểm], 0 <=2 [được một điểm], 2 <=3 [được một điểm], 4 <=4 [được một điểm].
Chúng ta phải tìm K để đạt điểm cao nhất. Nếu có nhiều câu trả lời, hãy trả về chỉ số nhỏ nhất như vậy K. Vì vậy, nếu đầu vào là K =2, thì câu trả lời sẽ là 5.
Vì vậy, nếu đầu vào là [2,3,1,5,1], thì đầu ra sẽ là 3, điều này là do -
| K | Mảng | Điểm |
|---|---|---|
| 0 | [2,3,1,5,1] | 2 |
| 1 | [3,1,5,1,2] | 3 |
| 2 | [1,5,1,2,4] | 3 |
| 3 | [5,1,2,4,1] | 4 |
| 4 | [1,2,4,1,3] | 3 |
Câu trả lời sẽ là 3.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- ret:=0
- n:=kích thước của A
- Xác định cnt mảng có kích thước n
- để khởi tạo i:=0, khi i
- nếu A [i] <=i, thì -
- minI:=0, (tăng cnt [minI] lên 1)
- maxI:=i - A [i]
- nếu maxI + 1
- cnt [maxI + giảm 1] xuống 1
- nếu i + 1
- cnt [i + tăng 1] lên 1
- nếu A [i] <=i, thì -
- nếu A [i]> =n, thì -
- Bỏ qua phần sau, chuyển sang phần lặp tiếp theo
- minI:=i + 1
- (tăng cnt [minI] lên 1)
- maxi:=i + (n - A [i])
- nếu maxi + 1
- cnt [maxi + giảm 1] đi 1
- maxCnt:=temp
- ret:=i
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int bestRotation(vector<int>& A) {
int ret = 0;
int n = A.size();
vector <int> cnt(n);
for(int i = 0; i < n; i++){
if(A[i] <= i){
int minI = 0;
cnt[minI]++;
int maxI = i - A[i];
if(maxI + 1 < n) cnt[maxI + 1]--;
if(i + 1 < n) cnt[i + 1]++;
}else{
if(A[i] >= n) continue;
int minI = i + 1;
cnt[minI]++;
int maxi = i + (n - A[i]);
if(maxi + 1 < n)cnt[maxi + 1]--;
}
}
int maxCnt = -1;
int temp = 0;
for(int i = 0; i < n; i++){
temp += cnt[i];
if(temp > maxCnt){
maxCnt = temp;
ret = i;
}
}
return ret;
}
};
main(){
Solution ob;
vector<int> v = {2,3,1,5,1};
cout << (ob.bestRotation(v));
} Đầu vào
[2,3,1,5,1]
Đầu ra
3