Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >33. Search in Rotated Sorted Array

33. Search in Rotated Sorted Array

作者头像
翎野君
发布于 2023-05-12 12:26:31
发布于 2023-05-12 12:26:31
2040
举报
文章被收录于专栏:翎野君翎野君

两道题 

33. Search in Rotated Sorted Array

https://leetcode.com/problems/search-in-rotated-sorted-array/

81. Search in Rotated Sorted Array II

https://leetcode.com/problems/search-in-rotated-sorted-array-ii/

这两道题都是属于循环有序数组的查找问题,无论是查找具体元素的下标还是检查一个目标值是否在数组中,主要的判断逻辑都是一致的。

思路

这种将有序数组翻转成循环有序数组的解决办法是将原数组分段。用首元素start、中间元素mid、尾元素end,可以将数组分为两个子数组s1,s2。

则这两个子数组中,必然有至少一个子数组是有序的。

那么如何确定那一段是有序的呢,通过分析可以看到只有3种情况:

  1. 当start就是A中最小的元素时,以下不等式成立:start <= mid <= end
  2. 当最小值位于(start, mid]时,则有:mid <= end <= start
  3. 当最小值出现在(mid,end]时,则有:end <= start <= mid

所以通过start, mid, end的大小关系,就可以判断出s1和s2哪个是有序的。

通过比较要查找的目标target与start,mid,end的大小关系,就可以知道target位于哪个子数组。

若target位于有序的子数组,则用二分查找就可以了。否则,对无序的子数组重复刚才的过程就可以了。

代码

代码语言:javascript
AI代码解释
复制
package com.lingyejun.dating.chap11.toutiao;

public class RotatedArrayQuery {


    /**
     * 33. Search in Rotated Sorted Array
     * 查找目标值下标
     *
     * @param nums
     * @param target
     * @return
     */
    public int searchTargetIndex(int[] nums, int target) {
        int start = 0;
        int end = nums.length - 1;

        while (start <= end) {

            // (start ... middle ... end)
            int mid = (start + end) / 2;

            if (nums[mid] == target) {
                return mid;
            }

            // 前半段数组是有序的
            if (nums[start] < nums[mid]) {
                // target在前半段数组中
                if (target < nums[mid] && target >= nums[start]) {
                    // 将原数组折半,取出前半段数组
                    end = mid - 1;
                } else {
                    // target在后半段数组中
                    start = mid + 1;
                }
            }

            // 后半段数组是有序的
            else if (nums[mid] < nums[end]) {
                // target在后半段数组中
                if (target > nums[mid] && target <= nums[end]) {
                    // 将原数组折半,取出后半段数组
                    start = mid + 1;
                } else {
                    // target在前半段数组中
                    end = mid - 1;
                }
            } else {
                // 此种场景{1, 0, 1, 1, 1} start = mid = end
                start++;
            }
        }
        return -1;
    }

    /**
     * 81. Search in Rotated Sorted Array II
     *
     * 查找是否存在目标值
     *
     * @param nums
     * @param target
     * @return
     */
    public static boolean searchExistsKey(int nums[], int target) {
        int start = 0;
        int end = nums.length - 1;

        while (start <= end) {

            int mid = (start + end) / 2;

            if (nums[mid] == target) {
                return true;
            }

            if (nums[start] < nums[mid]) {

                if (nums[start] <= target && target < nums[mid]) {
                    end = mid - 1;
                } else {
                    start = mid + 1;
                }
            } else if (nums[start] > nums[mid]) {
                if (nums[mid] < target && target <= nums[end]) {
                    start = mid + 1;
                } else {
                    end = mid - 1;
                }

            } else {
                start++;
            }
        }
        return false;
    }

    public static void main(String[] args) {

        int[] array = new int[]{1, 0, 1, 1, 1};

        RotatedArrayQuery caq = new RotatedArrayQuery();

        System.out.println(caq.searchTargetIndex(array, 0));
        System.out.println(caq.searchExistsKey(array, 1));
    }

}

首发链接:https://cloud.tencent.com/developer/article/2285728

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
leetcode: 33. Search in Rotated Sorted Array
leetcode: 81. Search in Rotated Sorted Array II
JNingWei
2018/09/28
4190
Leetcode 33. Search in Rotated Sorted Array
版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/81542801
Tyan
2019/05/25
4390
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
6710
LeetCode 33-Search in Rotated Sorted Array
看到这个题目,头脑中第一个蹦出来的就是找到rotated的元素,然后两边分别做binary search就可以了。
Dylan Liu
2019/07/01
3890
【每日一题】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
4060
【每日一题】33. Search in Rotated Sorted Array
​LeetCode刷题实战81:搜索旋转排序数组 II
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/01/20
5090
​LeetCode刷题实战81:搜索旋转排序数组 II
每天一道leetcode-33
目前准备每天刷一道题leetcode的题目,以此来激励那些零基础入门的人,千万不要被什么科班和非科班的说法吓倒了,计算机这个行业只要你肯努力,没有什么逾越不了的鸿沟。
乔戈里
2019/09/17
3050
每天一道leetcode-33
LeetCode<二分搜索> 33 & 81 Search in Rotated Sorted Array I&II
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
大学里的混子
2018/10/30
7130
Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unkonwn to you beforehand. (i.e.,0,1,2,4,5,6,7 might become 4 5 6 7 0 1 2).
青木
2018/10/09
4270
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
5310
LeetCode 0081 - Search in Rotated Sorted Array II
Follow up for “Search in Rotated Sorted Array”:
Reck Zhang
2021/08/11
2630
打卡群刷题总结0727——搜索旋转排序数组 II
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii
木又AI帮
2020/07/29
2350
33. 搜索旋转排序数组
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
lucifer210
2019/09/29
4760
33. 搜索旋转排序数组
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
2290
剑指 offer代码解析——面试题38数字在排序数组中出现的次数
题目:统计一个有序数组中K出现的次数。 分析:本题最直观的思路就是遍历数组,统计K出现的次数即可。 这种方式的时间复杂度为O(n)。下面我们充分利用“有序数组”这一条件,提高算法的时间效率。 对于一个有序数组,所有的数字K一定都集中在一起,因此只要我们找到这一组K的头和尾就能知道K出现的次数。 此时问题就转化为:在一个有序数组中寻找某个数字。 我们很自然地就想到了二分搜索,在目前所有的搜索算法中,二分搜索具有最高的搜索效率。 对于本题,我们需要进行两次二分搜索,一次寻找K的头,一次寻找K的尾。
大闲人柴毛毛
2018/03/09
6910
【leetcode】33. 搜索旋转排序数组
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
小王不头秃
2024/06/19
2150
【刷穿 LeetCode】33. 搜索旋转排序数组(中等)
例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] 。
宫水三叶的刷题日记
2021/02/20
3170
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.3K0
LeetCode 81,在不满足二分的数组内使用二分法 II
今天是LeetCode专题第50篇文章,我们来聊聊LeetCode中的81题Search in Rotated Sorted ArrayII。
TechFlow-承志
2020/07/02
1.2K0
Leetcode 81. Search in Rotated Sorted Array II
版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/81568314
Tyan
2019/05/25
3890
相关推荐
leetcode: 33. Search in Rotated Sorted Array
更多 >
LV.1
这个人很懒,什么都没有留下~
作者相关精选
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场