33. 搜索旋转排序数组(二分法)

1、算法思路

题目要求必须设计一个时间复杂度为 O(log n) 的算法解决此问题,所以我们可以采用二分法。

Step1. 先把 nums[0] 作为目标值,通过二分法找到旋转点索引;

Step2. 如果旋转点索引为0,则数组本身就是升序的,否则思想上可以将数组一分为二,看做两个升序数组。

Step3. 判断 target 目标值在一分为二后的数组的哪一个里面,从而确定左右端索引。(特殊情况:如果旋转点索引为0,则左右端索引就是 0 和 nums.length - 1)

Step4. 确认了左右端索引之后,通过二分法查找到 target 值所在索引,若不存在则返回 -1。

2、Java代码实现

public class Search {public static void main(String[] args) {Solution sol = new Solution();System.out.println(sol.search(new int[]{4,5,6,7,0,1,2}, 0));//4System.out.println(sol.search(new int[]{4,5,6,7,0,1,2}, 5));//1System.out.println(sol.search(new int[]{1,3,5,7,9}, 3));//1System.out.println(sol.search(new int[]{1,3}, 3));//1System.out.println(sol.search(new int[]{3,1}, 1));//1System.out.println(sol.search(new int[]{8,9,2,3,4}, 9));//1System.out.println(sol.search(new int[]{4,5,6,7,0,1,2}, 3));//-1System.out.println(sol.search(new int[]{1}, 0));//-1System.out.println(sol.search(new int[]{1,3}, 0));//-1}
}// 逐一查找法
//class Solution {
//    public int search(int[] nums, int target) {
//        for (int i = 0; i < nums.length; i++) {
//            if(nums[i] == target){
//                return i;
//            }
//        }
//        return -1;
//    }
//}// 二分查找法
class Solution {public int search(int[] nums, int target) {if (nums.length == 1){return nums[0] == target ? 0: -1;}// 寻找旋转点的索引int l = 1;int r = nums.length - 1;while(l <= r){int mid = l + r >> 1;if(nums[mid] > nums[0]) l = ++mid;else r = --mid;}if(l > nums.length - 1){  //旋转点为0时,数组依旧是升序排列的l = 0;r = nums.length - 1;}else if (target >= nums[0]){r = l - 1;l = 0;}else if(target <= nums[nums.length - 1]){r = nums.length - 1;}else return -1;  //target小于nums[0]又大于nums[n-1]时直接返回-1//target等于两边时直接返回索引if (nums[l] == target) return l;if (nums[r] == target) return r;// 最后进行二分查找while(l < r){int mid = l + r >> 1;if(nums[mid] == target) return mid;if(nums[mid] < target) l = ++mid;else r = --mid;}if(nums[l] != target) return -1;return l;}
}

3、完整题目

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k0 <= 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

提示:

  • 1 <= nums.length <= 5000
  • -10^4 <= nums[i] <= 10^4
  • nums 中的每个值都 独一无二
  • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
  • -10^4 <= target <= 10^4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在C++中,当无符号数和有符号数进行减法运算时,通常有符号数会被转换为无符号数

一段程序引发的问题&#xff1a; for (int i 0; i < s.length() - L; i) {string str s.substr(i, L);if ( hash[str] 2) {res.push_back(str);}} }terminate called after throwing an instance of std::out_of_rangewhat(): basic_string::substr: __pos (which is 2…

SpringMVC Day 11 : 零 xml 配置

前言 欢迎来到《Spring MVC Day 11: 零XML配置》&#xff01;在之前的学习中&#xff0c;我们已经掌握了如何使用Spring MVC框架构建灵活、高效的Web应用程序。然而&#xff0c;我们可能还记得那些繁琐的XML配置文件&#xff0c;它们是我们在过去几天中使用的方式。 好消息是…

软考高项-配置管理相关论文

论文思路 制订配置管理计划 配置管理的目标和范围配置管理角色和责任安排建立了开发库、受控库、产品库三个配置库配置项识别 识别配置项目需求、设计文档、程序代码、项目管理计划等内容&#xff0c;配置项分配一些属性&#xff0c;比如配置项的名称、编号、版本号、责任人等…

Stable Diffusion 的提示词使用技巧

推荐Stable Diffusion自动纹理工具&#xff1a; DreamTexture.js自动纹理化开发包 什么是提示语&#xff1f; 提示语是人工智能中的一个重要组成部分&#xff0c;尤其是自然语言处理 &#xff08;NLP&#xff09;。在AI自人工智能中&#xff0c;想要获得好的效果&#xff0c;简…

JavaScript执行上下文和调用栈

上节课我们已经说过了&#xff0c;JavaScript的代码执行是发生在js引擎中的调用堆栈的&#xff0c;但是具体是如何运行的&#xff0c;我们来详细剖析一下 如何执行上下文 执行上下文&#xff1a; 执行上下文是指在JavaScript中代码被执行时所创建的环境。它包含了变量、函数、…

pam_radius库的使用

一. 前言 我们知道&#xff0c;linux pam库是一系列的库&#xff0c;用于处理一些应用程序的认证工作&#xff0c;比如login程序。但是默认的pam库只是用于本地认证&#xff0c;也就是认证的用户名和密码存储在本机上。如果需要远程认证&#xff0c;比如向radius服务器认证&…

uni-app学习笔记

目录 一、前期准备 1、项目认识 2、pages.json基本配置 3、创建页面 二、tabBar 1、获取图标 2、代码配置 三、基础认识 1、页面生命周期 2、App.vue应用生命周期 四、基础组件 1、scroll-view可滚动视图区域 2、提示框 3、swiper滑块视图容器 4、form表单组件 一…

【漏洞复现】Apache_HTTP_2.4.49_路径穿越漏洞(CVE-2021-41773)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞验证方式一 curl方式二 bp抓包 说明内容漏洞编号CVE-2021-41773漏洞名称Apache HTTP 路径穿越漏洞漏…

新手入门Python一定要看的八个超实用建议!

文章目录 前言一、项目文件事先做好归档二、永远不要手动修改源数据并且做好备份三、做好路径的正确配置四、代码必要的地方做好备注与说明五、加速你的Python循环代码六、可视化你的循环代码进度七、使用高效的异常捕获工具八、要多考虑代码健壮性关于Python技术储备一、Pytho…

[PyTorch][chapter 61][强化学习-免模型学习1]

前言&#xff1a; 在现实的学习任务中&#xff0c;环境 其中的转移概率P,奖赏函数R 是未知的&#xff0c;或者状态X也是未知的 称为免模型学习&#xff08;model-free learning&#xff09; 目录&#xff1a; 1: 蒙特卡洛强化学习 2&#xff1a;同策略-蒙特卡洛强化学习 3&am…

JavaFX作业

前言&#xff1a; 在写这个作业之前&#xff0c;尝试在JavaFX中添加全局快捷键&#xff0c;测试了大概5个小时&#xff0c;到处找教程换版本&#xff0c;结果最后还是没找到支持Java8以上的&#xff08;也有可能是我自己的问题&#xff09;&#xff0c;最后只能退而求其次&…

手写数字识别--神经网络实验

实验源码自取&#xff1a; 我自己搞的代码&#xff0c;预测精度才94% 神经网络实验报告源码.zip - 蓝奏云 老师给的实验源码答案和资料&#xff0c;预测精度高达99% 深度学习实验报告.zip - 蓝奏云 上深度学习的课程&#xff0c;老师布置了一个经典的实验报告&#xff0c;我做…

libpcap之数据分流

当前系统都是多核系统&#xff0c;为了充分利用多核优势&#xff0c;数据包可以在底层就进行分流&#xff0c;可以通过多线程/多进程对同一个接口的数据进行并行的处理。 一、实验 一个server/client程序一个简单的抓包程序&#xff0c;抓取server/client之间的通信数据 1.1 …

如何利用Python实现分词和NER的Web服务

大家都知道python在数据处理、数据分析和机器学习等方面的强大之处&#xff0c;那么如何使用Python实现Web方式的HTTP应用和服务呢&#xff0c;其实有很多种方式&#xff0c;比如利用gradio、streamlit实现web应用&#xff0c;利用FastApi实现web服务等等&#xff0c;具体详见之…

【蓝桥杯 第十四届省赛Java B组】真题训练(A - C)正在更新

目录 A、阶乘求和 - BigInteger B、幸运数字 - 字符串 进制转换 暴力大法 C、数组分割 - A、阶乘求和 - BigInteger 思路&#xff1a; 当时比赛时&#xff0c;拿计算器算的&#xff0c;然后辛辛苦苦也没对 看到这个数肯定很大&#xff0c;而且只求后9位&#xff0c;阶乘越…

【计算机网络】应用层

应用层协议原理 客户-服务器体系结构&#xff1a; 特点&#xff1a;客户之间不能直接通信&#xff1b;服务器具有周知的&#xff0c;固定的地址&#xff0c;该地址称为IP地址。 配备大量主机的数据中心常被用于创建强大的虚拟服务器&#xff1b;P2P体系结构&#xff1a; 特点&…

K8S知识点(二)

&#xff08;1&#xff09;K8S概念 K8S是通过控制pod来控制容器进而控制程序的 service是沟通Pod和外键的桥梁&#xff0c;可以实现负载均衡的效果&#xff0c;加权负载的效果 &#xff08;2&#xff09;环境搭建-环境规划 &#xff08;3&#xff09;环境搭建-主机安装 使用…

求先序排列

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 给出一棵二叉树的中序与后序排列。求出它的先序排列。&#xff08;约定树结点用不同的大写字母表示&#xff0c;长度 ≤ 8&#xff09;。 输入描述: 2行&#xff0c;均为大写字母组…

MTR (Mini-Transaction)

MTR&#xff0c;即Mini-Transaction&#xff0c;是InnoDB存储引擎中的一种管理并发事务的机制。它用于确保在并发环境下&#xff0c;数据库操作的一致性、隔离性和持久性。MTR被设计用来管理数据库内部的操作&#xff0c;以确保多个事务在并发执行时&#xff0c;对数据的修改不…

时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解

时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 PSO-VMD粒子群算法PSO优化VMD变分模态分解 可直接运行 分解效果…