LeetCode HOT 100:搜索旋转排序数组
题目:33. 搜索旋转排序数组
题目描述:
一个整数数组,数组每个值都不相同,且该整数数组是一个被旋转过的数组。被旋转过的数组是指,由一个递增的数组,从某一个下标开始往后的元素,移到最开头。举个例子:数组[1, 3, 4, 5, 7]
,假设从下标为2
处开始旋转,得到旋转过的数组为[4, 5, 7, 1, 3]
,如果从下标0
处开始旋转,那么相当于没有旋转,还是原数组。
本题能保证,给你的整数数组,一定是每个值都不相同,且一定是一个旋转过的数组。然后给你一个target
的值,让你返回target
值在数组中的下标,如果target
不在数组中,返回-1
。要求时间复杂度为O(logn)
。
步骤:
这题一看要求时间复杂度O(logn)
,想到使用二分法,但是二分法需要数组满足递增,乍一看本题并不满足。但是还是可以使用二分法,只不过思路稍微转变一下。
1、下标l
为0
,r
为n - 1
,开始进行二分。取得两者中间下标mid
,如果mid
下标的值正好等于target
,直接返回结果即可。
2、如果[l, mid]
是有序数组,且 target
值在[l, mid]
范围上,则我们应该将搜索范围缩小至 [l, mid - 1]
,否则在[mid + 1, r]
范围中寻找。
3、如果[mid, r]
是有序数组,且 target
值在[mid, r]
范围上,则我们应该将搜索范围缩小至 [mid + 1, r]
,否则在[l, mid - 1]
范围中寻找。
解释:
1、为什么本题可以使用二分法?二分法一般都需要数组有序。这个数组因为被旋转过,看似是无序的,其实是局部有序的。例如[4, 5, 7, 1, 3]
,[4, 5, 7]
和[1, 3]
都是有序的,所以在某些有序范围内,可以进行二分。
2、为什么要判断[l, mid]
或[mid, r]
是否有序?因为只有有序了,才能进行范围缩小。而至于在有序范围中怎么缩小,上面的步骤2
和3
说得很清晰了。
代码:
public int search(int[] nums, int target) {
int N = nums.length;
if (N == 0) return -1;
if (N == 1) return nums[0] == target ? 0 : -1;
int L = 0, R = N - 1;
int M = 0;
while (L <= R) {
M = L + ((R - L) >> 1);
if (nums[M] == target) return M;
// [L, M]有序,说明[L, R]无序
if (nums[L] <= nums[M]) {
// target在[L, M]范围上,接下来左侧继续二分
if (target >= nums[L] && target < nums[M]) {
R = M - 1;
} else { // 去右侧二分
L = M + 1;
}
} else { // [L, M]无序,说明[M, R]有序
if (target > nums[M] && target <= nums[R]) { // 如果[M, R]范围上包括了target,去右侧二分
L = M + 1;
} else { // 去左侧二分
R = M - 1;
}
}
}
return -1;
}
LeetCode HOT 100:搜索旋转排序数组的更多相关文章
- 【LeetCode】81. 搜索旋转排序数组 II
81. 搜索旋转排序数组 II 知识点:数组,二分查找: 题目描述 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 ...
- Leetcode题目33.搜索旋转排序数组(中等)
题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...
- 【LeetCode 33】搜索旋转排序数组
题目链接 [题解] 会发现旋转之后,假设旋转点是i 则0..i-1是递增有序的.然后i..len-1也是递增有序的. 且nums[i..len-1]<nums[0]. 而nums[1..i-1] ...
- LeetCode 81——搜索旋转排序数组 II
1. 题目 2. 解答 2.1. 方法一 基于 LeetCode 33--搜索旋转排序数组 中的方法二. 当 nums[mid] = nums[right] 时,比如 [1, 1, 2, 1, 1], ...
- LeetCode:搜索旋转排序数组【33】
LeetCode:搜索旋转排序数组[33] 题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ...
- Java实现 LeetCode 33 搜索旋转排序数组
33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值, ...
- 力扣Leetcode 33. 搜索旋转排序数组
33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值, ...
- [LeetCode每日一题]81. 搜索旋转排序数组 II
[LeetCode每日一题]81. 搜索旋转排序数组 II 问题 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 & ...
- LeetCode 81 - 搜索旋转排序数组 II - [二分+暴力]
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在于数组中. ...
- LeetCode(81): 搜索旋转排序数组 II
Medium! 题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给 ...
随机推荐
- 4.maven私服nexus2迁移到nexus3
注意,本文讲解的是针对我们原来所用的nexus2.14.5版本的升级配置流程,如果您的老私服版本并不是这个,那么请先参考这里:升级兼容性 – Repository Manager 2到3.选定对应可升 ...
- jumpserver 2222端口的使用
可以这样理解: 通过在jumpserver的web界面添加的用户,相应的也有权限通过远程使用命令的方式登陆jumpserver,进行相应的管理,只不过使用的端口是2222端口,不是常见的22端口. 一 ...
- Ubuntu20.04本地安装Redash中文版
一.安装基础环境: # 1.更换APT国内源 sudo sed -i s@/cn.archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources ...
- 7M与N的数学运算
m=eval(input()) n=eval(input()) a=m+n b=m*n c=m**n d=m%n e=max(m,n) print(a,b,c,d,e)
- Css3中自适应布局单位vh、vw
视口单位(Viewport units) 什么是视口? 在桌面端,视口指的是在桌面端,指的是浏览器的可视区域:而在移动端,它涉及3个视口:Layout Viewport(布局视口),Visual Vi ...
- js对象结构赋值const {XXX } =this
样例1: const { xxx } = this.state; 上面的写法是es6的写法,其实就相当于: const xxx = this.state.xxx 样例2: const {comment ...
- day03-MySQL基础知识02
MySQL基础知识02 4.CRUD 数据库CRUD语句:增(create).删(delete).改(update).查(Retrieve) Insert 语句 (添加数据) Update 语句(更新 ...
- BigDecimal 用法总结
转载请注明出处: 目录 1.BigDecimal 简介 2.构造BigDecimal的对象 3.常用方法总结 4.divide方法使用 5.setScale 方法使用 6.BigDecimal 数据库 ...
- PHP开启debug模式
我用的是lnmp一键集成环境 所以我的php.ini在/usr/local/php/ 把这个值改成从 Off 改成On 即可
- 齐博x1页面不直接报错,如何排查
有的页面是不会直接报错的,比如像下面这个,这个时候需要你用谷歌或火狐浏览器打开,按F12键进入开发者模式,然后选择Network选项,刷新一下当前的网页,就会看到红色的请求.单独打开他.就可以看到错误 ...