首页 > 其他分享 >搜索旋转数组

搜索旋转数组

时间:2024-07-05 14:02:40浏览次数:21  
标签:arr target mid 旋转 搜索 数组 区间 left

题目链接

搜索旋转数组

题目描述

注意点

  • 数组已被旋转过很多次
  • 数组元素原先是按升序排列的
  • 若有多个相同元素,返回索引值最小的一个

解答思路

  • 首先需要知道的是,本题数组中的旋转多次只是将头部的某些元素移动到尾部,所以不论怎么旋转,数组都是有一定顺序的,最差的情况是分为两段递增的子数组
  • 因为数组是有一定顺序的,所以首先考虑二分查找搜索数组,本题数组可能是两段递增的子数组组成并且数组中的元素可能重复,所以要考虑多方面:
    • 如果二分后的左区间是严格递增的:如果target在arr[left]~arr[mid]之间,说明target就在左区间内(不在左区间说明不存在),继续向左二分;否则说明target在右区间内,向右二分
    • 如果二分后的左区间是由两段递增的子数组组成的:如果target >= arr[left]或target <= arr[mid],说明target就在左区间内,继续向左二分;否则说明target在右区间内,向右二分
    • 如果二分后的左区间内的值都是相同的(arr[left] = arr[mid]):如果此时target等于该值,则直接将右边界移动到左边界即可(此时left就是结果值);否则需要不断移动左边界(每次移动一格,清除重复值)找到target

代码

class Solution {
    public int search(int[] arr, int target) {
        int left = 0, right = arr.length - 1;
        while (left < right) {
            int mid = left + ((right - left) >> 1);
            // 左区间升序
            if (arr[left] < arr[mid]) {
                // 值在左区间内
                if (target >= arr[left] && target <= arr[mid]) {
                    right = mid;
                } else {
                    left = mid + 1;
                }
                continue;
            }
            // 左区间不升序
            if (arr[left] > arr[mid]) {
                // 值在左区间内
                if (target >= arr[left] || target <= arr[mid]) {
                    right = mid;
                } else {
                    left = mid + 1;
                }
                continue;
            }
            // 左区间值都相同 
            if (arr[left] == arr[mid]) {
                // 注意清理重复值
                if (arr[left] != target) {
                    left++;
                } else {
                    right = left;
                }
            }
        }
        return arr[left] == target ? left : -1;
    }
}

关键点

  • 二分查找的思想
  • 注意边界问题
  • 注意有多个重复的target时怎么找到最小的索引

标签:arr,target,mid,旋转,搜索,数组,区间,left
From: https://blog.csdn.net/weixin_51628158/article/details/140125086

相关文章

  • 算法:递归数组求和
    递归数组求和给定一个数组,求所有元素的和算法思想:传入数组和下标,如果下标越界就返回0,否则返回当前值和下一个值的和,递归操作。Java实现:publicclassMain{ publicstaticintfunc(int[]array,intindex){ if(index>array.length-1){ return0; }el......
  • Arduino 驱动360度旋转传感器(如旋转编码器)
    以下是使用ArduinoUnoR3驱动一个360度旋转传感器(如旋转编码器)的详细说明、接线图和代码示例,其中传感器引脚为CLK、DT、SW、+、GND。所需材料ArduinoUnoR3360度旋转传感器(旋转编码器)面包板和连接线接线步骤连接旋转传感器:将旋转编码器的CLK引脚连接到ArduinoUno的......
  • LeetCode刷题之搜索二维矩阵
    20247/5一如既往的晴天,分享几张拍的照片嘿嘿,好几天没做题了,在徘徊、踌躇、踱步。蝉鸣的有些聒噪了,栀子花花苞也都掉落啦,今天给他剪了枝,接回一楼来了。ok,做题啦!图1、宿舍阳台摄,每天都是如此美景图2、吃饭路上桥上摄图3、桥的另一边摄okok,做题啦!1、题目描述2、算......
  • 从搜索框的提示词中再探防抖和节流
    前言最近逛掘金时,看到了一篇文章。发现是我之前写过的一篇文章主题是防抖和节流的,看防抖时没感觉哪里不一样,但是当我看到节流时发现他的节流怎么这么繁琐(・∀・(・∀・(・∀・*)?抱着疑惑的想法,我仔细拜读了这篇文章。嗯。。好家伙不得不说大佬就是大佬,考虑的确实真的很细......
  • Day2 |977.有序数组的平方& 209.长度最小的子数组&59.螺旋矩阵II
    977.有序数组的平方这题太简单了,中间的排序我用的选择排序贴代码了publicint[]sortedSquares(int[]nums){for(inti=0;i<nums.length;i++){nums[i]=nums[i]*nums[i];}for(inti=0;i<nums.length;i++){......
  • 【34. 在排序数组中查找元素的第一个和最后一个位置】
    题目:给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你必须设计并实现时间复杂度为O(logn)的算法解决此问题。示例1:输入:nums=[5,7,7,8,8,10],t......
  • 代码随想录刷题day 2 | 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋矩阵II
    977.有序数组的平方classSolution{publicint[]sortedSquares(int[]nums){int[]ans=newint[nums.length];intleft=0,right=nums.length-1;for(inti=nums.length-1;i>=0;i--){if(nums[right]*nums[righ......
  • 数据库MyBatis传递数组或集合
    应用场景假设你有两个表,一个是商品信息表(表1,例如商品类别信息),另一个是库存信息表(表2,记录每种商品的库存数量)。你想知道特定几个商品类别(通过其ID标识,这里是1、2、3)的所有商品的总库存量。这个查询就会非常有用,它不仅能够跨表根据商品类别ID筛选出相关商品,还能计算出这些商......
  • 指针数组与数组指针(超详细!!!)
    指针数组秘诀:括号优先,先右后左,由近及远        指针数组是一个数组,其中每个元素都是一个指针。指针数组可以用于存储指向不同数据类型的指针,例如字符、整数或结构体等。int*p[n];//定义了一个指针数组,数组大小为n,数组中的每个元素都是一个int*指针 存储指向整......
  • 「代码随想录算法训练营」第二天 | 数组 part2
    977.有序数组的平方题目建议:本题关键在于理解双指针思想题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/题目难度:简单文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep题目状态:通过......