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

【二分】搜索旋转数组

文章目录

  • 不重复数组找最小值,返回下标
  • 重复数组找最小值,返回下标
  • 不重复数组找target,返回下标
  • 重复数组找target,返回bool
  • 重复数组找target,返回下标

不重复数组找最小值,返回下标

在这里插入图片描述

在这里插入图片描述

class Solution {public int findMin(int[] nums) {int n = nums.length;int l = 0;int r = n - 1;while(l <= r){if(l == r || nums[l] < nums[r]){break;}int mid = l + (r - l) / 2;if(nums[mid] >= nums[l]){// [l, mid]有序l = mid + 1;}else{// [mid, r]有序r = mid;}}return nums[l];}
}
class Solution {public int findMin(int[] nums) {int n = nums.length;int l = 0;int r = n - 1;while(l <= r){if(l == r || nums[l] <= nums[r]){// [l,r]已经有序break;}int mid = l + (r - l) / 2;if(nums[mid] > nums[l]){l = mid + 1;}else if(nums[mid] < nums[l]){r = mid;}else{l++;}}return nums[l];}
}

重复数组找最小值,返回下标

在这里插入图片描述

在这里插入图片描述

nums[mid] < nums[l],说明最小值肯定在(low, mid]区间内,则r = mid

在这里插入图片描述
nums[mid] > nums[l],说明最小值肯定在mid右侧,(mid,r]区间内,则l = mid + 1

在这里插入图片描述

nums[mid] == nums[l],无法判断最小值在哪个区间,但一定在(l, r]内部
我们假设nums[l]、nums[mid]就是最小值,那我们可以排除l,即l++,因为nums[mid]可以替代nums[l]
若nums[l]、nums[mid]不是最小值,我们直接l++

寻找旋转排序数组中的最小值 II

class Solution {public int findMin(int[] nums) {int n = nums.length;int l = 0;int r = n - 1;while(l <= r){if(l == r || nums[l] <= nums[r]){// [l,r]已经有序break;}int mid = l + (r - l) / 2;if(nums[mid] > nums[l]){l = mid + 1;}else if(nums[mid] < nums[l]){r = mid;}else{l++;}}return nums[l];}
}

不重复数组找target,返回下标

在这里插入图片描述

class Solution {public int search(int[] nums, int target) {int n = nums.length;int l = 0;int r = n - 1;while(l <= r){int mid = l + (r - l) / 2;if(target == nums[mid]){return mid;}if(nums[mid] > nums[l]){// [l, mid]有序if(target >= nums[l] && target < nums[mid]){// 在有序区间内r = mid - 1;}else{l = mid + 1; }}else if(nums[mid] < nums[l]){// [mid, r]有序if(target > nums[mid] && target <= nums[r]){// 在有序区间内l = mid + 1;}else{r = mid - 1; }}else{l++;}}return -1;}
}

重复数组找target,返回bool

在这里插入图片描述

class Solution {public int search(int[] nums, int target) {int n = nums.length;int l = 0;int r = n - 1;while(l <= r){int mid = l + (r - l) / 2;if(target == nums[mid]){return mid;}if(nums[mid] > nums[l]){// [l, mid]有序if(target >= nums[l] && target < nums[mid]){// 在有序区间内r = mid - 1;}else{l = mid + 1; }}else if(nums[mid] < nums[l]){// [mid, r]有序if(target > nums[mid] && target <= nums[r]){// 在有序区间内l = mid + 1;}else{r = mid - 1; }}else{l++;}}return -1;}
}

重复数组找target,返回下标

在这里插入图片描述

class Solution {public int search(int[] nums, int target) {int l = 0;int r = nums.length - 1;if (r == -1)return -1;while (l < r) {                                         // 循环结束条件l==rint mid = l + (r - l) / 2;if (nums[l] < nums[mid]) {                              // 如果左值小于中值,说明左边区间升序               if (nums[l] <= target && target <= nums[mid]) {     // 如果目标在左边的升序区间中,右边界移动到midr = mid;} else {                                               // 否则目标在右半边,左边界移动到mid+1l = mid + 1;}} else if (nums[l] > nums[mid]) {                       // 如果左值大于中值,说明左边不是升序,右半边升序if (nums[l] <= target || target <= nums[mid]) {     // 如果目标在左边,右边界移动到midr = mid;} else {                                               // 否则目标在右半边,左边界移动到mid+1l = mid + 1;}} else if (nums[l] == nums[mid]) {                      // 如果左值等于中值,可能是已经找到了目标,也可能是遇到了重复值if (nums[l] != target) {                            // 如果左值不等于目标,说明还没找到,需要逐一清理重复值。l++;} else {                                               // 如果左值等于目标,说明已经找到最左边的目标值 r = l;                                      // 将右边界移动到l,循环结束}}}return (nums[l] == target) ? l : -1;                     // 返回l,或者-1}
}
http://www.lryc.cn/news/141223.html

相关文章:

  • APSIM模型应用与参数优化、批量模拟
  • QT使用QXlsx实现对Excel sheet的相关操作 QT基础入门【Excel的操作】
  • ARM DIY(四)WiFi 调试
  • AIGC ChatGPT 实现动态多维度分析雷达图制作
  • Vue2向Vue3过度核心技术路由
  • ElasticSearch常用方法
  • nginx下添加http_ssl_module并且配置域名,指定端口
  • 【PHP】PHP变量
  • KVM创建虚拟机可访问外网+可使用Xshell等工具连接
  • 数据库——Redis 没有使用多线程?为什么不使用多线程?
  • Node.JS教程
  • mysql表锁死怎么办?事务锁sql超时被锁死怎么办?
  • 基于JSP+Servlet+mysql学生宿舍管理系统
  • Enabling Large Language Models to Generate Text with Citations
  • Qt Qml实现仪表盘动画
  • 一次PostgreSQL复杂jsonb数据矫正过程分享
  • 如何在App里拉起小程序?
  • 函数式编程-Stream流学习第二节-中间操作
  • SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
  • 无涯教程-进程 - 组会话控制
  • tomcat高可用和nginx高可用
  • 关于ios Universal Links apple-app-site-association文件 Not Found的问题
  • Objectarx MFC 添加ListControl并控制显隐
  • 2023年高教社杯数学建模思路 - 复盘:人力资源安排的最优化模型
  • SpringMVC 第二天
  • 抖音seo短视频矩阵系统源码开发源代码分享--开源-可二开
  • No message found under code ‘-1‘ for locale ‘zh_CN‘.
  • QtWidgets和QtQuick融合(QML与C++融合)
  • 基于Vue的3D饼图
  • Gateway简述