当前位置: 首页 > news >正文

算法题: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

相关文章:

  • sqli-labs-1
  • nacos配置中心docker部署、配置及 goLang 集成使用
  • Kafka(消息队列)--简介
  • 单基因泛癌+实验简单验证,要素丰富,没研究方向的赶紧上车
  • Nginx 实现负载均衡
  • java数据结构(红黑树)set集合 HashSet HashSet三个问题 LinkedHashSetTreeSet TreeSet集合默认规则排序规则
  • 软件测试面试怎样介绍自己的测试项目?会问到什么程度?
  • Zookeeper经典应用场景实战(一)
  • 11月9日,每日信息差
  • SpringCloudAlibaba - 项目完整搭建(Nacos + OpenFeign + Getway + Sentinel)
  • KubeSphere v3.4.0 部署K8S Docker + Prometheus + grafana
  • web应用程序、Django框架的学习
  • 思谋科技进博首秀:工业多模态大模型IndustryGPT V1.0正式发布
  • GaN HEMT 电容的分析建模,包括寄生元件
  • xv6实验课程--xv6的写时复制fork(2023)
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • gf框架之分页模块(五) - 自定义分页
  • javascript从右向左截取指定位数字符的3种方法
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JS题目及答案整理
  • mac修复ab及siege安装
  • mysql innodb 索引使用指南
  • Mysql优化
  • Redis学习笔记 - pipline(流水线、管道)
  • Service Worker
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 汉诺塔算法
  • 聊一聊前端的监控
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用 @font-face
  • 温故知新之javascript面向对象
  • 一个SAP顾问在美国的这些年
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • #include
  • (2)MFC+openGL单文档框架glFrame
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .htaccess配置常用技巧
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .Net8 Blazor 尝鲜
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .net下的富文本编辑器FCKeditor的配置方法
  • /bin、/sbin、/usr/bin、/usr/sbin
  • /etc/fstab和/etc/mtab的区别
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [AutoSar]BSW_Com02 PDU详解
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C++提高编程](三):STL初识
  • [ERROR] ocp-server-ce-py_script_start_check-4.2.1 RuntimeError: ‘tenant_name‘