给你一个长度为 n
下标从 0 开始的数组 nums
,数组中的元素为 互不相同 的正整数。请你返回让 nums
成为递增数组的 最少右移 次数,如果无法得到递增数组,返回 -1
。
一次 右移 指的是同时对所有下标进行操作,将下标为 i
的元素移动到下标 (i + 1) % n
处。
示例 1:
输入:nums = [3,4,5,1,2] 输出:2 解释: 第一次右移后,nums = [2,3,4,5,1] 。 第二次右移后,nums = [1,2,3,4,5] 。 现在 nums 是递增数组了,所以答案为 2 。
示例 2:
输入:nums = [1,3,5] 输出:0 解释:nums 已经是递增数组了,所以答案为 0 。
示例 3:
输入:nums = [2,1,4] 输出:-1 解释:无法将数组变为递增数组。
class Solution {
public:
int minimumRightShifts(vector<int>& nums) {
int index = 1;
bool flag = true;
for(; index < nums.size(); index++){
if (nums[index] < nums[index - 1]){
flag = false;
break;
}
}
if (flag)
return 0;
vector<int> a(nums);
sort(nums.begin() + index, nums.end());
flag = true;
for (int i = index; i < nums.size(); i++){
if (nums[i] != a[i]){
flag = false;
break;
}
}
if (!flag)//第二段非递增
return -1;
if (nums[nums.size() - 1] > nums[0])
return -1;
return nums.size() - index;
}
};
思路:
依据题意,该数组要想得到最少右移次数有两种情况:第一种是数组本身就是递增序列最少右移次数为0,第二种情况是数组可分为2段递增序列,且满足第二段的末尾元素(即数组末尾元素)小于数组第一段开头元素(即数组首部元素),该情况下最少右移次数为第二段递增序列的长度。
过程如下:
找到第一段递增序列的结束位置(如果等于数组的长度-1则说明为递增序列则返回0),然后将判断 第一段递增序列后的元素是否是递增,如果不是则返回-1;如果是的话则判断数组尾部元素是否小于数组首部元素。