【1752. 检查数组是否经排序和轮转得到】
创始人
2024-02-21 11:11:28
0

来源:力扣(LeetCode)

描述:

给你一个数组 numsnums 的源数组中,所有元素与 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 。

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100

方法:直接遍历

思路与算法

  按照题意可以知道 nums 的源数组 source 中的所有元素都按非递减顺序排列,假设数组的长度为 n,假设当数组向右轮转 x 个位置,令 x = x mod  n,根据置换公式 source[i] = nums[(i + x) mod  n] 可以知道:

nums[0, ⋯, x − 1] = source[n − x, ⋯, n − 1]
nums[x, ⋯, n − 1] = source[0, ⋯, n − x − 1]
  • 当 x = 0 时,则意味着数组 nums 本身为非递减顺序排列,nums 与原数组相同,此时我们只需要判断 nums 是否为非递减顺序排列;
  • 当 x > 0 时,则意味着数组 nums 分为了两部分,nums[0, ⋯ , x − 1], nums[x, ⋯ , n−1] ,需进行分类检测;

对于 x > 0 时,根据题意可以知道对于原始数组 source 一定满足当 i ≤ j 时,则 source[i] ≤ source[j] ,由此我们可以推出:

  • 当 0 < i < x 时,则一定满足 nums[i − 1] ≤ nums[i] ;
  • 当 x < i < n 时,则一定满足 nums[i − 1] ≤ nums[i] ;
  • 当 x ≤ i < n 时,由于 source[n − x − 1] ≤ source[n − x] ,则一定满足 nums[i] ≤ nums[n−1] ≤ nums[0] ;
    • 当满足 source[n − 1] = source[0] 时,则意味着整个数组均为相等,从任意处轮转数组均保持不变;
    • 当满足 source[n − 1] > source[0] 时,此时 source[n − 1], source[0] 对应的元素为 nums[x − 1], nums[x] ,此时一定满足 nums[x − 1] > nums[x] ,则此时找到第一个索引 i 满足 nums[i] < nums[i − 1] 时,nums[i−1],nums[i] 对应着源数组中的 source[n−1],source[0] ;

根据上述推理,我们检测过程如下:

  • 首先检测数组是否非递减排序,如果满足非递减排序则直接返回 true;
  • 如果数组不满足非递减排序,则找到第一个 i 满足 nums[i] < nums[i − 1],然后分别检测子数组 nums[0, ⋯ , i − 1],nums[i, ⋯ , n − 1] 是否都满足非递减排序;
  • 如果两个子数组都满足非递减排序,还需检测 nums[i, ⋯ , n − 1] 中的元素是否都满足小于等于 nums[0] ,实际我们只需检测 nums[n − 1] 是否满足小于等于 nums[0] 即可;

根据上述描述的检测过程进行检测即可。

代码:

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];}
};

1

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

相关内容

热门资讯

中国人民银行发布一次性信用修复... 人民网北京12月22日电 (记者黄盛)中国人民银行今日发布关于实施一次性信用修复政策有关安排的通知。...
一次性信用修复政策6问6答 符合哪些条件的逾期信息可以适用一次性信用修复政策,作不予展示处理? 个人是否需要主动申请适用一次性...
一次性信用修复政策,一图读懂! 相关报道: 责编:李文玉 | 审核:李震 | 监审:古筝 (来源:中国人民银行)
家校纠纷的细节背后,藏着资源和... 石门县第二中学 一起普通的家校纠纷,源头是高二学生与班主任之间产生隔阂,后来演变成班主任退群、学生推...
一次性信用修复政策来了!细则详... 本文转自【央视新闻客户端】; 今天(22日),中国人民银行发布通知,实施一次性信用修复政策,支持信用...
原创 泰... 12月18日,中国驻泰国大使张建卫会见泰国新任总检察长易提蓬的这场会面,看似是一次常规外交互动,实则...
郑重提醒:一次性信用修复政策不... 央行发布一次性信用修复政策,支持信用受损但积极还款的个人高效便捷重塑信用。一次性信用修复政策实行“免...
央行发布一次性信用修复政策! 12月22日,中国人民银行发布通知,实施一次性信用修复政策,支持信用受损但积极还款的个人高效便捷重塑...
支持个人信用重塑!央行一次性信... 为支持信用受损但积极还款的个人高效便捷重塑信用,12月22日中国人民银行对外发布一次性信用修复政策有...