leetcode 33. 搜索旋转排序数组

33. 搜索旋转排序数组(Search in Rotated Sorted Array) 题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。 分析 数组旋转 本题是数组,而且要求时间复杂度为 O(log n) 。应该能够自然想到二分查找。 但是直接使用二分查找行不行呢?我们看一看下面这个例子: 在数组[3 4 5 阅读详情

leetcode 33. 搜索旋转排序数组

题目

给你一个整数数组 nums ,和一个整数 target 。 

该整数数组原本是按升序排列,但输入时在预先未知的某个点上进行了旋转。
(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 
请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 
示例 1: 
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4
示例 2: 
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1 
 示例 3: 
输入:nums = [1], target = 0
输出:-1

 提示: 
 1 <= nums.length <= 5000 , 
 -10^4 <= nums[i] <= 10^4 ,
 nums 中的每个值都 独一无二 , 
 nums 肯定会在某个点上旋转 , 
 -10^4 <= target <= 10^4 ,

解题思路

这是一个二分查找的变种应用
三个指针,
low,区间开始的位置
mid, 区间中间的位置
high,区间结束的位置

在这里插入图片描述

情况1:nums[mid] > nums[low]

左区间有序,右区间无序。 
1. 当区间中间值小于目标值时,即数据在mid与4之间位置,low=mid+1,下次右区间搜索。
2. 当区间中间值大于目标值时,数据可能在1与2之间,或者在3与4之间,这如何区分?
    这里可使用nums[low]加以判断
        当nums[low] > target,说明在1与2之间,则low=mid+1,下次右区间搜索。
        当nums[low] < target, 说明在3与mid之间,则hig=mid-1,下次左区间搜索。
3. 当区间中间值等于目标值时,这就是我们要找的数据。   

情况2:nums[mid] <= nums[low]

左区间无序,右区间有序。
1. 当区间中间值小于目标值时,数据可能存在1与2之间,或者3与4之彰,这如何区分
    这里可使用nums[high]加以判断
        当nums[high] < target,数据在3与4之间,则high=mid-1,下次左区间搜索。
        当nums[high] > target,数据在mid与2之间,则low=mid+1,下次右区间搜索。
2. 当区间中间值大于目标值时,数据只能在1与mid之间,则high=mid-1,下次左区间搜索。
3. 当区间中间值等于目标值时,这就是我们要找的数据。   

代码实现

public class Solution {

  public int search(int[] nums, int target) {

    if (nums == null || nums.length <= 0) {
      return -1;
    }

    int low = 0, mid, high = nums.length - 1;

    while (low <= high) {
      mid = low + (high - low) / 2;

      // 最左侧匹配的情况
      if (nums[low] == target) {
        return low;
      }
      // 中间匹配的情况
      else if (nums[mid] == target) {
        return mid;
      }
      // 右侧匹配的情况
      else if (nums[high] == target) {
        return high;
      }

      // 如果num[mid]>num[low],说明左区间有序
      if (nums[mid] > nums[low]) {
        // 如果num[mid] < target,说明在右区间
        if (nums[mid] < target) {
          low = mid + 1;
        }
        // 如果num[mid] > target,说明在左区间
        else {
          // 如果nums[low] < target,则在左区间中
          if (nums[low] < target) {
            high = mid - 1;
          }
          // 如果nums[low] > target,则在右区间中
          else {
            low = mid + 1;
          }
        }
      }
      // 如果num[mid]<=num[low],说明右区间有序
      else {
        // 右区间有序,并且目标值大于中间值,存在两种情况
        if (nums[mid] < target) {
          // 如果当前查找值比结束的值还要大,说明在左区间
          if (nums[high] < target) {
            high = mid - 1;
          }
          // 如果当前查找值比结束的值要小,说明在右区间
          else {
            low = mid + 1;
          }
        }
        // 右区间有序,并且nums[mid] > target,说明仅存在于左区间的可能
        else {
          high = mid - 1;
        }
      }
    }

    return -1;
  }
}

在这里插入图片描述

33. 搜索旋转排序数组 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,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] 。 给你 旋转后 的数组 nums 和一. 阅读详情

相关推荐

【中等】力扣算法题解析LeetCode33:搜索旋转排序数组

要求在旋转后的有序数组中查找目标值,要求时间复杂度为O(log n)。通过二分查找,每次判断左右两部分的有序性来确定目标值所在区间。若左半有序且目标值在左半范围内,则搜索左半;否则搜索右半。若未找到则返回-1。该方法高效利用了二分查找的特性,确保在旋转数组中快速定位目标值。

ylumwd的博客 437

搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [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], targ...

Wang.T的博客 5405

Multisim实战:从8选1到32选1数据选择器的完整搭建指南(附常见问题解决)

本文提供了一份详尽的Multisim实战指南,手把手教你从基础的8选1数据选择器开始,逐步级联搭建16选1乃至32选1数据选择器。文章深入剖析了级联的核心逻辑、片选方案以及使用译码器的专业方法,并附带了电源连接、输出冲突、信号毛刺等常见问题的诊断与解决技巧,帮助电子工程学生和爱好者扎实掌握数字电路的系统设计与仿真调试。

dd012的博客 729

leetcode:33. 搜索旋转排序数组

对于旋转数组,nums=[4,5,6,7,0,1,2]

OceanStar的博客 1010

别再乱选保护板了!手把手教你用ABLIC S-8254A为3/4串锂电池组DIY安全保护电路

本文详细介绍了如何使用ABLIC S-8254A保护集成电路为3/4串锂电池组DIY安全保护电路。从选型策略、电路搭建到功能验证,手把手教你实现可靠的充放电保护系统,适用于无人机、电动工具等场景,确保锂电池组的安全使用。

weixin_42525264的博客 187

Miniforge3部署教程,完美替代Anaconda3

大背景不介绍了,哎!直接上教程!

zzy_ucas的博客 1万+

搜索旋转排序数组(LeetCode 33)

这启示我们可以在常规二分查找的时候查看当前 mid 为分割位置分割出来的两个部分 [l, mid] 和 [mid + 1, r] 哪个部分是有序的,并根据有序的那个部分确定我们该如何改变二分查找的上下界,因为我们能够根据有序的那部分判断出 target 在不在这个部分。拿示例来看,我们从 6 这个位置分开以后数组变成了 [4, 5, 6] 和 [7, 0, 1, 2] 两个部分,其中左边 [4, 5, 6] 这个部分的数组是有序的,其他也是如此。将旋转排序数组均分,一定有一部分的数组是有序的。

Doublelv 的博客专栏。 1246

ArcGIS中的Python入门知识点整理

关于Arcpy大家应该都比较熟悉,Python用的好,数据处理快又好!在ArcGIS中ArcPy是一个以成功的arcgisscripting模块为基础并继承了arcgisscripting功能进而构建而成的站点包。目的是为以实用高效的方式通过Python执行地理数据分析、数据转换、数据管理和地图自动化创建基础。ArcPy提供了丰富纯正的Python体验,具有代码自动完成功能。今天我们就看看关于Arcpy相关处理的使用,通过一些简单代码与大家一起认识Arcpy。

xjt921122的博客 1770

【力扣LeetCode】33 搜索旋转排序数组

题目描述(难度中) 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [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,...

Jiewang的博客 336

ZYNQ PS-PL数据交互方式总结

一,中断 二,IO方式:MIO EMIO GPIO 三,BRAM或FIFO或EMIF (1)通过BRAM实现PL/PS之间交互 PS 的配置如下图所示。使能 M_AXI_GP0 口,将 FCLK_CLK0 设为 100MHz,使能 PL 至 PS 的中断。 AXI BRAM Controller IP 核连接 PS 的 M_AXI_GP0 口和 BRAM,完成 AXI 接口至 BRAM 接口的转换。 添加BRAM,将BRAM设置为双口RAM,将PORTA与AXI B...

wangjie36的博客 1万+

RK3568平台开发系列讲解:内核启动流程

第 493 行的 ENTRY 指明了了 Linux 内核入口,入口为stext,stext 定义在文件arch/arm/kernel/head.S 中 , 因此要分析Linux 内核的启动流程,就得先从文件arch/arm/kernel/head.S 的 stext 处开始分析。_mmap_switched 定义在文件 arch/arm/kernel/head-common.S,__mmap_switched 最终会调用 start_kernel 函数。⑥、r2=atags 或者设备树(dtb)首地址。

内核笔记 217

33. 搜索旋转排序数组 - 力扣(LeetCode)

整数数组nums按升序排列,数组中的值。在传递给函数之前,nums在预先未知的某个下标k)上进行了,使数组变为(下标计数)。例如,在下标3处经旋转后可能变为。给你的数组nums和一个整数target,如果nums中存在这个目标值target,则返回它的下标,否则返回-1。你必须设计一个时间复杂度为O(log n)的算法解决此问题。输入:nums = [4,5,6,7,0,1,2], target = 0输出:4输入:nums = [4,5,6,7,0,1,2], target = 3。

Dubhehug的博客 1190

基于STM32设计的指针式电子钟与万年历(升级版)

这是基于STM32设计的一个指针式电子钟+万年历小项目,采用3.5寸的LCD屏显示时钟,日历、温度、天气,支持触摸屏调整设置时间,设置闹钟,查看日历等等。整体项目主要是技术点就是LCD屏的图形绘制。比如: 时钟的时针绘制、分针、秒针、表盘、日历绘制等等。

1万+

leetcode力扣33.搜索旋转排序数组

题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [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], tar

LifeGoesOn 220

【ArcGIS Pro微课1000例】0022:基于DEM进行流域分析生成流域图

填洼Fill,在进行水文分析后续操作前,首先要对DEM进行填洼,创建无凹陷点的DEM。在ArcGIS中使用的是八方向流量建模(D8算法),工具位于水文分析下的【流向】。填洼需要使用水文分析工具下的【填洼】。确定输入与输出即可。

智慧空间实验室 2750

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

LeetCode33-搜索旋转排序数组

LeetCode33-搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。 示例 1: 输入: nums = [...

lyd1995的博客 434

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LeetCode 33:搜索旋转排序数组(Java实现)

LeetCode 33:搜索旋转排序数组题目思路代码结果 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。 示例 1: ...

qq_45093368的博客 387

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LeetCode 33 搜索旋转排序数组

LeetCode 33 搜索旋转排序数组题目描述思路代码 题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。 思路 求...

weixin_37905795的博客 175

#力扣 LeetCode33. 搜索旋转排序数组 @FDDLC

题目描述: 33. 搜索旋转排序数组 - 力扣(LeetCode) (leetcode-cn.com) Java代码: class Solution { public int search(int[] a, int t) { for(int i=0;i<a.length;i++)if(a[i]==t)return i; return -1; } } ...

LiuXingchang的博客 387

LeetCode 33搜索旋转排序数组

LeetCode 33搜索旋转排序数组 题目简述:假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。 输入:nums = [4,5,6,7,0,1,2], target = 0 输出:4 输入:nums = [4,5,6,7,0,1,2], target = 3

XBlog 184

《LeetCode力扣练习》第33题 搜索旋转排序数组 Java

《LeetCode力扣练习》第33题 搜索旋转排序数组 Java 一、资源 题目: 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,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 处经旋转后可

XRT_knives的博客 398

LeetCode33 搜索旋转排序数组(Java实现)

LeetCode33 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。 示例 1: 输入: nums = [4,5...

大白菜的博客 364

力扣第33题:搜索旋转排序数组

此算法利用旋转数组的一部分总是有序的性质,通过二分查找和分段判断有效缩小搜索范围,最终实现高效搜索。

weixin_48941116的博客 664

Leetcode 33. 搜索旋转排序数组 C++

Leetcode 33. 搜索旋转排序数组 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [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 = [

weixin_43750513的博客 473

golang力扣leetcode 33.搜索旋转排序数组

33.搜索旋转排序数组33.搜索旋转排序数组题解代码 33.搜索旋转排序数组 33.搜索旋转排序数组 题解 代码 package main func search(nums []int, target int) int { left, right := 0, len(nums)-1 for left+1 < right { mid := left + (right-left)/2 if nums[mid] == target { return mid } if nums[

清风 437
上一篇: 二分查找
下一篇: java如何避免传递null-空对象模式
null_null_bug
博客等级 码龄7年 72粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值