배열 A가 있다고 가정하고 배열이 A[K], A[K+1], A{K+2], ... A[A.length - 1]이 되도록 K만큼 회전할 수 있습니다. A[0], A[1], ..., A[K-1]. 그런 다음 색인보다 작거나 같은 항목은 1점의 가치가 있습니다.
예를 들어 배열 [2, 4, 1, 3, 0]이 있고 K =2만큼 회전하면 [1, 3, 0, 2, 4]가 됩니다. 1> 0 [점수 없음], 3> 1 [점 없음], 0 <=2 [1점 획득], 2 <=3 [1점 획득], 4 <=4 [이득이기 때문에 이것은 3점의 가치가 있습니다. 한 점].
우리는 가장 높은 점수를 얻을 K를 찾아야 합니다. 답이 여러 개인 경우 인덱스 K 중에서 가장 작은 값을 반환합니다. 따라서 입력이 K =2와 같으면 답은 5가 됩니다.
따라서 입력이 [2,3,1,5,1]과 같으면 출력은 3이 됩니다. 이는 -
K | 배열 | 점수 |
---|---|---|
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 |
정답은 3입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- ret :=0
- n :=A의 크기
- n 크기의 배열 cnt 정의
- 초기화 i의 경우:=0, i
- A[i] <=i이면 -
- minI :=0, (cnt[minI] 1 증가)
- maxI :=i - A[i]
- maxI + 1
- cnt[maxI + 1 감소] 1
- i + 1
- cnt[i + 1 증가] 1
- A[i] <=i이면 -
- A[i]>=n이면 -
- 다음 부분은 무시하고 다음 반복으로 건너뜁니다.
- 최소I :=나는 + 1
- (cnt[minI] 1 증가)
- 최대 :=나는 + (n - A[i])
- 최대값 + 1
- cnt[최대값 + 1 감소] 1
- maxCnt :=임시
- 레트 :=나
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#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)); }
입력
[2,3,1,5,1]
출력
3