Search in Rotated Sorted Array - 循环有序数组查找问题

简介: Search in Rotated Sorted Array - 循环有序数组查找问题

两道题

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位于有序的子数组,则用二分查找就可以了。否则,对无序的子数组重复刚才的过程就可以了。

代码

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));
    }
}

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

目录
相关文章
Leetcode Find Minimum in Rotated Sorted Array 题解
对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数,注意,K有可能是0,也就是没有翻转。
48 0
LeetCode 167 Two Sum II - Input array is sorted(输入已排序数组,求其中两个数的和等于给定的数)
给定一个有序数组和一个目标值 找出数组中两个成员,两者之和为目标值,并顺序输出
86 0
|
算法 Python
LeetCode 108. 将有序数组转换为二叉搜索树 Convert Sorted Array to Binary Search Tree
LeetCode 108. 将有序数组转换为二叉搜索树 Convert Sorted Array to Binary Search Tree
|
6月前
|
Python
使用array()函数创建数组
使用array()函数创建数组。
131 3
|
30天前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
1月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
1月前
|
存储 JavaScript 前端开发
JavaScript Array(数组) 对象
JavaScript Array(数组) 对象
27 3
|
1月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
|
2月前
|
Go
Golang语言之数组(array)快速入门篇
这篇文章是关于Go语言中数组的详细教程,包括数组的定义、遍历、注意事项、多维数组的使用以及相关练习题。
33 5
|
3月前
|
Python
PyCharm View as Array 查看数组
PyCharm View as Array 查看数组
84 1