33、搜索旋转排序数组

news/2024/10/29 2:35:57/

难度:中等
整数数组 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 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -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], target = 3
输出:-1

示例 3:
输入:nums = [1], target = 0
输出:-1

双指针法
思路
要求时间复杂度O(log n)首先想到二分法,但二分法适用于有序数组,本题中的数组可以理解为:由两个升序数组拼接而成的数组,但第一个升序数组的最小值是大于第二个升序数组的最大值的。

已知在数组中取最中间的数:

  1. 这个数等于target,则直接返回
  2. 不等于,再判断:
    2.1. 这个数大于最后一个数的值,则这个数的左侧部分是有序的
    2.2.小于,则右侧部分是有序的
    分别在有序部分中判断target是否在这个区间,在则继续缩小区间,不在则在另一侧区间
var search = function(nums, target) {var start = 0var end = nums.length - 1var middle while(start<=end){middle = Math.floor((start+end)/2) //向下取整if(nums[middle] == target){ //如果中间值正好是target,则直接返回return middle}//如果不是,则判断//1、中间值小于右指针的值,则右侧区间(middle,end]有序//2、中间值大于右指针的值,左侧区间[start,middle)有序if(nums[middle]<nums[end]){   if(nums[middle]<target && target<=nums[end]){//在(middle,end]区间start = middle+1}else{  //在[start,middle)end = middle - 1}}else{  if(nums[start]<=target && target<nums[middle]){//在[start,middle)区间end = middle-1}else{  //在(middle,end]区间start = middle+1}}}return -1
};

http://www.ppmy.cn/news/37446.html

相关文章

RocketMQ中核心概念及术语介绍

文章目录 角色ProducerConsumerPushConsumerPullConsumer概念术语Producer GroupConsumer GroupTopicTagMessage QueueOffsetConsumer Offset集群消费广播消费顺序消息普通顺序消息严格顺序消息RocketMQ中有很多独有的概念,其中包括一些术语和角色。 理清楚基本的概念是理解原…

前端重装系统需要安装什么

目录 1.安装nvm 2.安装git 3.安装yarn 4. 安装cnpm 5. 配置hbuilder 6. 配置vscode 1.安装nvm 1.1 下载 下载地址&#xff1a;Releases coreybutler/nvm-windows GitHub 如果下载慢&#xff0c;可以复制链接到迅雷下载 1.2 安装 在c盘下创建一个nvm文件夹并创建一个…

【蓝桥杯集训·每日一题】 AcWing 3996. 涂色

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴区间DPUnique函数一、题目 1、原题链接 3996. 涂色 2、题目描述 有 n 个砖块排成一排&#xff0c;从左到右编号为 1∼n。 其中&#xff0c;第 i 个砖块的初始颜色为 ci。 …

一键部署自己的ChatGPT!

昨晚咱们群友推荐了一个叫做ChatGPT-Next-Web项目&#xff0c;可以一键免费部署你的私人 ChatGPT 网页应用。今早起来尝试了下&#xff0c;整体过程非常丝滑&#xff0c;觉得有必要推荐给大家。项目整体是基于Vercel平台开发的&#xff0c;只要提供api key&#xff0c;即可在1分…

xijs更新指南(v1.2.1)

xijs 是一款开箱即用的 js 业务工具库, 聚集于解决业务中遇到的常用函数逻辑问题, 帮助开发者更高效的开展业务开发.接下来就和大家一起分享一下v1.2.1 版本的更新内容以及后续的更新方向.1. 添加算法模块分类该模块主要由 WangLei802 贡献, 添加内容如下:添加冒泡排序算法及其…

开发了一个抠图/去背景应用

jr们早上好 iPhone 的 iOS 16有个很酷的功能&#xff0c;长按照片就能把其中的拍摄主体提取出来&#xff0c;抠图过程比一般的抠图App方便&#xff0c;精细度也更高。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KIlpLyow-1680141413142)(https…

【面试题】面试官:请你说说对Vue响应式数据的理解

前言 我们平时的面试过程当中&#xff0c;问到Vue&#xff0c;几乎都会问到响应式的问题&#xff0c;因为在Vue的实现当中&#xff0c;响应式系统的实现就占据很大一个篇幅。这是Vue声明式编程的基石。那么如何理解响应式数据呢&#xff1f;相信结合源码以及手写实现会有一个更…

选择Kendo React PDF查看器的几个理由,你Pick哪个?

Kendo UI致力于新的开发&#xff0c;来满足不断变化的需求&#xff0c;通过React框架的Kendo UI JavaScript封装来支持React Javascript框架。Kendo UI for React能够为客户提供更好的用户体验&#xff0c;并且能够更快地构建更好的应用程序。 虽然查看PDF可能不是开发人员最需…