news 2026/6/1 1:20:57

LeetCode 1752. 检查数组是否经排序和轮转得到【旋转数组,至多一次递减】简单

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 1752. 检查数组是否经排序和轮转得到【旋转数组,至多一次递减】简单

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给你一个数组numsnums的源数组中,所有元素与nums相同,但按非递减顺序排列。

如果nums能够由源数组轮转若干位置(包括 0 个位置)得到,则返回true;否则,返回false

源数组中可能存在重复项

注意:数组A在轮转x个位置后得到长度相同的数组B,使得对于每一个有效的下标i,满足B[i] == A[(i+x) % A.length]

示例 1:

输入:nums=[3,4,5,1,2]输出:true解释:[1,2,3,4,5]为有序的源数组。 可以轮转 x=2个位置,使新数组从值为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

方法 至多一次严格递减

根据题意,如果n u m s numsnums是由一个递增数组旋转得到,那么n u m s numsnums至多有两个递增段。即n u m s numsnums至多有一对相邻元素是严格递减的,即n u m s [ i − 1 ] > n u m s [ i ] nums[i - 1] > nums[i]nums[i1]>nums[i]至多出现一次。此外,如果有两个递增段,第二段的最大值不能超过第一段的最小值,即n u m s [ 0 ] ≥ n u m s [ n − 1 ] nums[0]\ge nums[n-1]nums[0]nums[n1]

写法一如下:

classSolution{publicbooleancheck(int[]nums){intn=nums.length;booleansorted=true;for(inti=1;i<n;i++){if(nums[i-1]>nums[i]){// 严格递减if(!sorted){// 之前出现过严格递减,说明至少有三个递增段returnfalse;}sorted=false;// 标记遇到了严格递减}}returnsorted||nums[0]>=nums[n-1];}}
classSolution{public:boolcheck(vector<int>&nums){intn=nums.size();boolsorted=true;for(inti=1;i<n;i++){if(nums[i-1]>nums[i]){// 严格递减if(!sorted){// 之前出现过严格递减,说明至少有三个递增段returnfalse;}sorted=false;// 标记遇到了严格递减}}returnsorted||nums[0]>=nums[n-1];}};
classSolution:defcheck(self,nums:list[int])->bool:is_sorted=Trueforx,yinpairwise(nums):ifx>y:# 严格递减ifnotis_sorted:# 之前出现过严格递减,说明至少有三个递增段returnFalseis_sorted=False# 标记遇到了严格递减returnis_sortedornums[0]>=nums[-1]
funccheck(nums[]int)bool{n:=len(nums)sorted:=truefori:=1;i<n;i++{ifnums[i-1]>nums[i]{// 严格递减if!sorted{// 之前出现过严格递减,说明至少有三个递增段returnfalse}sorted=false// 标记遇到了严格递减}}returnsorted||nums[0]>=nums[n-1]}

写法二如下,提前判断n u m s [ 0 ] ≥ n u m s [ n − 1 ] nums[0] \ge nums[n - 1]nums[0]nums[n1]

classSolution{publicbooleancheck(int[]nums){intn=nums.length;booleansorted=nums[0]>=nums[n-1];for(inti=1;i<n;i++){if(nums[i-1]>nums[i]){// 严格递减if(!sorted){// 之前出现过严格递减,说明至少有三个递增段returnfalse;}sorted=false;// 标记遇到了严格递减}}returntrue;}}
classSolution{public:boolcheck(vector<int>&nums){intn=nums.size();boolsorted=nums[0]>=nums[n-1];for(inti=1;i<n;i++){if(nums[i-1]>nums[i]){// 严格递减if(!sorted){// 之前出现过严格递减,说明至少有三个递增段returnfalse;}sorted=false;// 标记遇到了严格递减}}returntrue;}};
classSolution:defcheck(self,nums:list[int])->bool:is_sorted=nums[0]>=nums[-1]forx,yinpairwise(nums):ifx>y:# 严格递减ifnotis_sorted:# 之前出现过严格递减,说明至少有三个递增段returnFalseis_sorted=False# 标记遇到了严格递减returnTrue
funccheck(nums[]int)bool{n:=len(nums)sorted:=nums[0]>=nums[n-1]fori:=1;i<n;i++{ifnums[i-1]>nums[i]{// 严格递减if!sorted{// 之前出现过严格递减,说明至少有三个递增段returnfalse}sorted=false// 标记遇到了严格递减}}returntrue}

复杂度分析:

  • 时间复杂度:O ( n ) O(n)O(n),其中n nnn u m s numsnums的长度。
  • 空间复杂度:O ( 1 ) O(1)O(1)

思考题

1、在n u m s numsnums中,找到一个最长的连续子数组a aa,满足a aa是由一个递增数组旋转得到的。
答:可以使用变长滑动窗口,用一个变量记录当前窗口内下降点的数量。

2、输入q u e r i e s queriesqueries,对于每个q u e r i e s [ i ] = [ l i , r i ] queries[i]=[l_i ,r_i]queries[i]=[li,ri],判断n u m s numsnums的连续子数组[ l i , r i ] [l_i, r_i][li,ri]是否由一个递增数组旋转得到。
答:每次查询都遍历,则时间复杂度过高。可以预处理前缀和来达到O ( 1 ) O(1)O(1)的单次查询效果。做法是:用一个数组记录所有局部下降点(n u m s [ i − 1 ] > n u m s [ i ] nums[i-1]> nums[i]nums[i1]>nums[i]i ii为下降点),并用前缀和统计区间[ l + 1 , r ] [l+1, r][l+1,r]内的下降点总数,为0 00则必然满足题意,为1 11且左端点≥ \ge右端点也满足题意,≥ 2 \ge 22则一定不满足。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/1 1:19:05

机械臂角度识别 机械臂自由度识别 yolov8机械臂关键点检测模型部署+教程+代码+数据集+工业应用

部署一个基于YOLOv8的机械臂三个关键点检测模型涉及到几个步骤&#xff0c;包括环境搭建、数据准备、模型训练与优化、以及最终的部署。下面是一个简化的教程&#xff0c;它将引导您完成整个过程。请注意&#xff0c;本教程假设您已经具备一定的Python编程基础和机器学习知识。…

作者头像 李华
网站建设 2026/6/1 1:05:42

达梦 DMHS/DRS 数据同步技术解析

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台达梦数据库产品体验站&#xff0c;DM8在线试玩&#xff0c;达梦数据库全系列产品免费下载&#xff0c;官方权威的快速上手文档和产品手册&#xff0c;最活跃的达梦技术社区&#xff0c;面向全行业ISV厂商免费的云适…

作者头像 李华
网站建设 2026/6/1 1:02:03

DSP28035双电压供电电路设计

TMS320F28035 供电电路设计原理与实现 TMS320F28035 作为一款基于 C28x 内核的数字信号处理器&#xff0c;其供电设计对系统稳定性至关重要。其核心采用 1.8V 电压&#xff0c;而 I/O 和外设接口采用 3.3V 电压&#xff0c;因此供电电路需满足双电压要求&#xff0c;并提供低噪…

作者头像 李华
网站建设 2026/6/1 1:01:30

Django+Vue羽毛球服务管理系统源码+论文

代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择&#xff1a; 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…

作者头像 李华
网站建设 2026/6/1 0:57:55

酒店业AI应用实战:从数据驱动到超个性化体验的十大场景解析

1. 项目概述&#xff1a;当酒店业遇上人工智能几年前&#xff0c;如果有人跟我说&#xff0c;酒店前台会由机器人接待&#xff0c;房间服务能通过智能镜子点餐&#xff0c;甚至系统能猜出我下次入住时想喝什么咖啡&#xff0c;我大概会觉得这是科幻电影里的场景。但今天&#x…

作者头像 李华