Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode<二分搜索> 33 & 81 Search in Rotated Sorted Array I&II

LeetCode<二分搜索> 33 & 81 Search in Rotated Sorted Array I&II

原创
作者头像
大学里的混子
修改于 2019-03-07 08:49:50
修改于 2019-03-07 08:49:50
67800
代码可运行
举报
文章被收录于专栏:LeetCodeLeetCode
运行总次数:0
代码可运行

33.Search in Rotated Sorted Array

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

Your algorithm's runtime complexity must be in the order of O(log n).

Example 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

题目大意:对于一个旋转后的有序数组经查找操作,注意算法的时间复杂度要求是O(logn)。

思路:对于O(logn)复杂度和有序数组,我们很容易想到采用二分搜索法,但是这个有序的数组经过旋转了,那么我们是否有方法让这个旋转后的数组变为严格意义上的有序数组呢?可以,但是想来想去,这种操作的复杂度会高于O(logn)。因此这种方法行不通。但是我们发现,数组是有两段的,这两段中必定有一段是严格意义上递增的数组,因此,我们就可以这这一段有序的数组上进行二分查找法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Share my intuitive thinking: the main idea is that we need to find some parts of array
 that we could adopt binary search on that, which means we need to find some completed 
 sorted parts, then determine whether target is in left part or right part. There is at 
 least one segment (left part or right part) is monotonically increasing.

解法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int search(int[] nums, int target) {
        if (nums == null || nums.length ==0) return -1;
        int left = 0 ,right = nums.length-1,mid;
        while (left<=right){
            mid = left+(right-left)/2;
            if (nums[mid] == target ) return mid;
            if (nums[left] <= nums[mid]){
                //left to mid is monotonically increasing
                if (target < nums[mid] && target>=nums[left]){
                    right = mid-1;
                }else {
                    left = mid+1;
                }
            }else {
                //mid to right is monotonically increasing
                if (target<=nums[right]&& target>nums[mid]){
                    left = mid+1;
                }else {
                    right = mid-1;
                }
            }
        }
        return  -1;
    }

81.Search in Rotated Sorted Array II

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]).

You are given a target value to search. If found in the array return true, otherwise return false.

Example 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: nums = [2,5,6,0,0,1,2], target = 0
Output: true

Example 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: nums = [2,5,6,0,0,1,2], target = 3
Output: false

题目大意:对于一个旋转后的有序数组经查找操作,注意这里的数组是有重复数字的。

思路:对于没有重复数字的旋转数组,我们很好的解决了将其转化为严格有序数组的问题,但是这个有重复数字的旋转的数组与上一题有什么区别呢?我们发现,当同样采用上面的思路的时候会存在一种情况:无法根据(nums[left]<= nums[mid])这一句来判断那一段严格的递增了,因为会存在首位是同一个数字的情况,例如: [2,5,6,0,0,1,2];所以,我们要对这种特殊的情况进行处理,也就是让此时的left和right所指向的数字是不同的,因此我们加入以下的处理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while(left < right && nums[left]== nums[right]) left++;

这样可以很好的解决上的问题。

解法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public boolean search (int[] nums, int target) {
        if (nums == null || nums.length ==0) return false;
        int left = 0 ,right = nums.length-1,mid;
        while (left<=right) {
            while (left < right && nums[left] == nums[right]) left++;
            mid = left + (right - left) / 2;
            if (nums[mid] == target) return true;
            if (nums[left]<=nums[mid]){
                if (target>=nums[left]&&target<nums[mid]){
                    right = mid-1;
                }else left = mid+1;
            }else {
                if (target>nums[mid]&&target<=nums[right]){
                    left = mid+1;
                }else right = mid-1;
            }
        }
        return false;
    }

总结:二分搜索有较多的变形,参照《LeetCode 34.Find First and Last Position of Element in Sorted Array》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【每日一题】33. Search in Rotated Sorted Array
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
公众号-不为谁写的歌
2020/08/11
3720
【每日一题】33. Search in Rotated Sorted Array
Leetcode 33 Search in Rotated Sorted Array 二分查找变式
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its index, otherwise return -1. You may assume no duplica
triplebee
2018/01/12
5050
LeetCode <二分搜索>34.Find First and Last Position of Element in Sorted Array
Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.
大学里的混子
2018/10/30
1.2K0
Binary Search - 33. Search in Rotated Sorted Array
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
ppxai
2020/09/23
3500
[LeetCode] 153. Find Minimum in Rotated Sorted Array
该文是关于LeetCode的一个题目,题目要求是找到旋转数组的最小值。首先介绍了旋转数组的概念,然后给出了一种求解方法,即使用二分查找。在文章中,还给出了具体的示例代码以及运行结果。
用户1148830
2018/01/03
6070
【leetcode刷题】T12-搜索旋转排序数组II
今天分享leetcode第12篇文章,也是leetcode第81题—搜索旋转排序数组II(Search in Rotated Sorted Array II),地址是:https://leetcode.com/problems/search-in-rotated-sorted-array-ii/
木又AI帮
2019/07/18
5130
【leetcode刷题】T12-搜索旋转排序数组II
重中之重的二分查找
There are two sorted arrays nums1 and nums2 of size m and n respectively.
王脸小
2020/07/28
5070
Leetcode 81 Search in Rotated Sorted Array II
Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this affect
triplebee
2018/01/12
6450
二分问题-LeetCode 33、34(上下边界,二分查找)
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
算法工程师之路
2019/09/19
9770
LeetCode 33-Search in Rotated Sorted Array
看到这个题目,头脑中第一个蹦出来的就是找到rotated的元素,然后两边分别做binary search就可以了。
Dylan Liu
2019/07/01
3580
​LeetCode刷题实战81:搜索旋转排序数组 II
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/01/20
4600
​LeetCode刷题实战81:搜索旋转排序数组 II
LeetCode 0033 - Search in Rotated Sorted Array
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
Reck Zhang
2021/08/11
1970
leetcode: 33. Search in Rotated Sorted Array
leetcode: 81. Search in Rotated Sorted Array II
JNingWei
2018/09/28
3910
每天一道leetcode-81
目前准备每天刷一道题leetcode的题目,以此来激励那些零基础入门的人,千万不要被什么科班和非科班的说法吓倒了,计算机这个行业只要你肯努力,没有什么逾越不了的鸿沟。
乔戈里
2019/09/17
3650
每天一道leetcode-81
T11-搜索旋转排序数组
今天分享leetcode第11篇文章,也是leetcode第33题—Search in Rotated Sorted Array(搜索旋转排序数组),地址是:https://leetcode.com/problems/search-in-rotated-sorted-array/
木又AI帮
2019/07/18
3900
T11-搜索旋转排序数组
LeetCode 0081 - Search in Rotated Sorted Array II
Follow up for “Search in Rotated Sorted Array”:
Reck Zhang
2021/08/11
2260
搜索旋转排序数组(leetcode 33)
如数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2]。
恋喵大鲤鱼
2023/10/12
2160
搜索旋转排序数组(leetcode 33)
折半查找部分有序
部分有序 本周qq群有人咨询 Search in Rotated Sorted Array 来源: https://leetcode.com/problems/search-in-rotated-sorted-array/ 难度:Difficulty: Hard 题目 Suppose a sorted array is rotated(旋转的) at some pivot unknown to you beforehand(提前的) eg: 0 1 2 3 4 5 6 7 旋转3个might beco
早起的鸟儿有虫吃
2018/04/13
7040
折半查找部分有序
33. Search in Rotated Sorted Array
https://leetcode.com/problems/search-in-rotated-sorted-array/
翎野君
2023/05/12
1800
LeetCode 33. 搜索旋转排序数组(二分查找)
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
Michael阿明
2020/07/13
3270
LeetCode 33. 搜索旋转排序数组(二分查找)
推荐阅读
相关推荐
【每日一题】33. Search in Rotated Sorted Array
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验