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