来源:力扣(LeetCode)
描述:
给你一个数组 nums 。nums 的源数组中,所有元素与 nums 相同,但按非递减顺序排列。
如果 nums 能够由源数组轮转若干位置(包括 0 个位置)得到,则返回 true ;否则,返回 false 。
源数组中可能存在 重复项 。
注意: 我们称数组 A 在轮转 x 个位置后得到长度相同的数组 B ,当它们满足 A[i] == B[(i+x) % A.length] ,其中 % 为取余运算。
示例 1:
输入:nums = [3,4,5,1,2]
输出:true
解释:[1,2,3,4,5] 为有序的源数组。
可以轮转 x = 3 个位置,使新数组从值为 3 的元素开始:[3,4,5,1,2] 。
示例 2:
输入:nums = [2,1,3,4]
输出:false
解释:源数组无法经轮转得到 nums 。
示例 3:
输入:nums = [1,2,3]
输出:true
解释:[1,2,3] 为有序的源数组。
可以轮转 x = 0 个位置(即不轮转)得到 nums 。
提示:
方法:直接遍历
思路与算法
按照题意可以知道 nums 的源数组 source 中的所有元素都按非递减顺序排列,假设数组的长度为 n,假设当数组向右轮转 x 个位置,令 x = x mod n,根据置换公式 source[i] = nums[(i + x) mod n] 可以知道:
对于 x > 0 时,根据题意可以知道对于原始数组 source 一定满足当 i ≤ j 时,则 source[i] ≤ source[j] ,由此我们可以推出:
根据上述推理,我们检测过程如下:
根据上述描述的检测过程进行检测即可。
代码:
class Solution {
public:bool check(vector& nums) {int n = nums.size(), x = 0;for (int i = 1; i < n; ++i) {if (nums[i] < nums[i - 1]) {x = i;break;}}if (x == 0) {return true;}for (int i = x + 1; i < n; ++i) {if (nums[i] < nums[i - 1]) {return false;}}return nums[0] >= nums[n - 1];}
};

复杂度分析
时间复杂度: O(n),其中 n 表示数组的长度。我们只需遍历一遍数组即可。
空间复杂度: O(1)。遍历过程中不需要额外的空间。
author:力扣官方题解