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] ). 编写一个函数来判断给 ...
随机推荐
- 容器监控:cAdvisor
CAdvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具.通过在主机上运行CAdvisor用户可以轻松的获取到当前主机上容器的运行统计信息,并以图表的形式向用户展示. 在本地运行 ...
- 某宝抢购taobaosnap开发与实现
某宝抢购脚本 Taobaosnap Taobaosnap is a completely open tool, which is used to buy goods in seconds on Tao ...
- (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
一.注意要点 1:输入字符串的的编码双方保持统一,如:UTF8: 2:HASH计算输出结果 byte[] 数组转String 时,编码要统一,如:转16进制小写字符串.当然也可以转Base64. 3: ...
- MySQL数据库-数据表(上)
数据表的基本操作. MySQL 数据库支持多种数据类型,大致可以分为 3 类:数值类型.日期和时间类型.字符串(字符)类型. (1)数值类型 数值类型用于存储数字型数据,这些类型包括整数类型(TINY ...
- abstract关键字的使用
1.abstract:抽象的 2.abstract可以用来修饰的结构:类.方法 3.abstract修饰类:抽象类 此类不能实例化 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全 ...
- 在mybatis中#{}和${}的区别
文章目录 1.第一个#{} 2.第二个${} 3.区别 1.第一个#{} 解释: 使用#{}格式的语法在mybatis中使用preparement语句来安全的设置值 PreparedStatement ...
- 齐博x1自定义字段关联其它字段的隐藏显示
如下图,对于单选\多选\下拉框这种表单类型, 选择某一项后, 你还想他关联其它选项的隐藏或显示,你可以加多一个参数设置处理通常情况,用得最普遍的,就是两项参数,用竖线隔开,比如下面的1|洋房2|别墅 ...
- go-zero docker-compose 搭建课件服务(六):完善jwt鉴权和返回结构
0.转载 go-zero docker-compose 搭建课件服务(六):完善jwt鉴权和返回结构 0.1源码地址 https://github.com/liuyuede123/go-zero-co ...
- 15行python代码实现人脸识别
方法一:face_recognition import cv2 import face_recognition img_path = "C:/Users/CJK/Desktop/1.jpg& ...
- JAVA系列之JVM内存调优
一.前提 JVM性能调优牵扯到各方面的取舍与平衡,往往是牵一发而动全身,需要全盘考虑各方面的影响.在优化时候,切勿凭感觉或经验主义进行调整,而是需要通过系统运行的客观数据指标,不断找到最优解.同时,在 ...