You are given a 0-indexed array nums of length n containing
distinct positive integers. Return _theminimum number of right shifts required to sort _numsand-1if this is not possible.
A right shift is defined as shifting the element at index i to index `(i
Input: nums =[3,4,5,1,2]Output: 2Explanation:
After the first right shift, nums =[2,3,4,5,1].After the second right shift, nums =[1,2,3,4,5].Now nums is sorted; therefore the answer is2.
If the array is sorted after some right shifts, it must be a rotated sorted array. Find the point where the order breaks. If there is more than one break, it’s impossible. Otherwise, the number of right shifts is n - break_index.
classSolution {
public:int minimumRightShifts(vector<int>& nums) {
int n = nums.size(), breaks =0, idx =-1;
for (int i =0; i < n; ++i) {
if (nums[i] > nums[(i+1)%n]) { breaks++; idx = i; }
}
if (breaks ==0) return0;
if (breaks >1) return-1;
return n - (idx+1);
}
};
1
2
3
4
5
6
7
8
9
funcminimumRightShifts(nums []int) int {
n, breaks, idx:= len(nums), 0, -1fori:=0; i < n; i++ {
ifnums[i] > nums[(i+1)%n] { breaks++; idx = i }
}
ifbreaks==0 { return0 }
ifbreaks > 1 { return-1 }
returnn- (idx+1)
}
1
2
3
4
5
6
7
8
9
10
11
classSolution {
publicintminimumRightShifts(int[] nums) {
int n = nums.length, breaks = 0, idx =-1;
for (int i = 0; i < n; i++) {
if (nums[i]> nums[(i+1)%n]) { breaks++; idx = i; }
}
if (breaks == 0) return 0;
if (breaks > 1) return-1;
return n - (idx+1);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
classSolution {
funminimumRightShifts(nums: IntArray): Int {
val n = nums.size
var breaks = 0; var idx = -1for (i in0 until n) {
if (nums[i] > nums[(i+1)%n]) { breaks++; idx = i }
}
if (breaks ==0) return0if (breaks > 1) return -1return n - (idx+1)
}
}
1
2
3
4
5
6
7
8
9
classSolution:
defminimumRightShifts(self, nums: list[int]) -> int:
n, breaks, idx = len(nums), 0, -1for i in range(n):
if nums[i] > nums[(i+1)%n]:
breaks +=1; idx = i
if breaks ==0: return0if breaks >1: return-1return n - (idx+1)
1
2
3
4
5
6
7
8
9
10
11
12
impl Solution {
pubfnminimum_right_shifts(nums: Vec<i32>) -> i32 {
let n = nums.len();
letmut breaks =0; letmut idx =-1;
for i in0..n {
if nums[i] > nums[(i+1)%n] { breaks +=1; idx = i asi32; }
}
if breaks ==0 { return0; }
if breaks >1 { return-1; }
n asi32- (idx+1)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
classSolution {
minimumRightShifts(nums: number[]):number {
constn=nums.length;
letbreaks=0, idx=-1;
for (leti=0; i<n; i++) {
if (nums[i] >nums[(i+1)%n]) { breaks++; idx=i; }
}
if (breaks===0) return0;
if (breaks>1) return-1;
returnn- (idx+1);
}
}