LeetCode 搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
示例 1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
示例 2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1
回忆一下,之前有一道寻找旋转排序数组中最小值的问题,我们当时使用num[left]和num[mid]的大小关系来判断此时mid指向的元素是在数组的前半段还是后半段。这道题和上一道稍微有点不一样,因为在上道题中,我们可以控制left与right始终分别指向左右两段数组。而这里,显然是不适合的。因此,我们可以先判断经过二分之后的两段数组哪个是排好序的,再判断target是否在这段排好序的数组当中,是的话,就简单了,简单二分搜索即可,不在的话,继续分析上回没排好序的数组,递归的按照以上的逻辑继续查找即可。
可以分以下三种情况讨论:
1. num[mid] = target,那么找到了,不用继续找了
2. num[mid] > num[left] 那么此时mid左端,一直到left的数组是排好序的。可以继续细分为两种情况:
(1)num[mid] > target && target >= num[left],说明此时target在mid左侧排好序的数组内。用二分查找处理这段数组即可
(2)如果不符合(1)中的条件,处理mid右侧的数组(还是按照先寻找排序数组,再二分查找的逻辑)
3. 2中的条件不成立,那么此时mid右端,一直到right的数组是排好序的。可以继续细分为两种情况:
(1)num[mid] < target && target <= num[right],说明此时target在mid右侧排好序的数组内。用二分查找处理这段数组即可
(2)如果不符合(1)中的条件,处理mid左侧的数组(还是按照先寻找排序数组,再二分查找的逻辑)
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left, right = 0, len(nums) - 1
while left <= right:
mid = int((left + right) / 2)
if nums[mid] == target:
return mid
if nums[mid] > nums[right]: # 说明左面是排序好的
if nums[left] <= target and nums[mid] > target:
# 在左边有序序列中进行折半查找
right = mid-1
else:
# 进入右边的序列进行查找
left = mid+1
else: #说明右边是排序好的
if nums[mid] < target and nums[right] >= target:
# 进入右边的有序序列进行查找
left = mid+1
else:
# 进入左边的序列进行查找
right = mid-1
return -1
LeetCode 搜索旋转排序数组的更多相关文章
- 33,Leetcode 搜索旋转排序数组-C++ 递归二分法
题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这 ...
- 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每日一题]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] ). 编写一个函数来判断给 ...
- LeetCode 81 搜索旋转排序数组II
题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在于 ...
- LeetCode 81. 搜索旋转排序数组 II(Search in Rotated Sorted Array II)
题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在 ...
随机推荐
- List、Set、Map集合的遍历方法
一.List集合遍历 public class TraversingList { /** * @author zhuxun describe: 定一个List集合并遍历 */ /** 定义一个List ...
- log4j日志properties配置
#Console Log log4j.rootLogger=INFO,console,debug,info,warn,error LOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss ...
- idou老师教你学Istio 26:如何使用Grafana进行可视化监控
使用Grafana插件进行监控是Istio提供的监控能力之一.Istio提供丰富的监控能力,Grafana插件在Istio对Prometheus支持的基础上,为用户提供基于网页仪表面板的可视化监控效果 ...
- idou老师教你学Istio 09: 如何用Istio实现K8S Ingress流量管理
前言 在Istio的世界里,如果想把外部的请求流量引入网格,你需要认识并会学会配置Istio Ingress Gateway 什么是Ingress Gateway 由于Kubernetes Ingr ...
- RedHat Enterprise Linux 5 配置Samba服务器
1.修改samba的配置文件 # gedit /etc/samba/smb.conf 在/etc/samba/smb.conf配置文件中找到Share Definitions模块添加以下代码: [ro ...
- 原生JS发送Ajax请求、JSONP
一.JS原生Ajax Ajax=异步Javascript+XML: ajax是一种数据请求的方式,不需要刷新整个页面.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. ajax的核心 ...
- 大数据之路week06--day01(VMware的下载与安装、安装CentOS)
好了,从今天开始就开始正式的进入大数据道路的轨道上了,当然了,Java 也是需要不断地在日后进行反复地学习,熟练掌握.(这里我要说一下,Java种还有一些I/O流.Lambda表达式和一些常用工具类有 ...
- JAVA遇见HTML——JSP篇:JSP内置对象(下)
什么是session session表示客户端与服务器的一次会话 Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间 从上述 ...
- 使用 EasyExcel 写Excel数据(表头动态)
引入 jar 包 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel&l ...
- Java8-Lock-No.05
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util ...