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

【二分查找】算法例题

目录

十八、二分查找

114. 搜索插入位置 ① √-

115. 搜索二维矩阵 ②

116. 寻找峰值 ② √-

117. 搜索旋转排序数组 ②

118. 在排序数组中查找元素的第一个和最后一个位置 ② √

119. 寻找寻钻排序数组中的最小值 ②

120. 寻找两个正序数组的中位数 ③

136. 直线上最多的点数 ③


十八、二分查找

114. 搜索插入位置 ① √-

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 为 无重复元素 的 升序 排列数组
  • -104 <= target <= 104

方法1:(0ms​)

    public static int searchInsert(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right){int mid = (left + right) / 2;if (target > nums[mid]){left = mid + 1;}else if (target < nums[mid]){right = mid  - 1;}else {return mid;}}return left;}

115. 搜索二维矩阵 ②

 给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

示例 1:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

方法1:(100%)

    public static boolean searchMatrix(int[][] matrix, int target) {int rows = matrix.length;int left = 0;int right = rows - 1;if (rows > 1) {while (left < right) {int mid = left + (right - left + 1) / 2;if (target < matrix[mid][0]) {right = mid - 1;} else if (target > matrix[mid][0]) {left = mid + 1;} else {return true;}}}int min = 0;int max = matrix[0].length - 1;if (max > 0) {while (min <= max) {int newMid = min + (max - min + 1) / 2;if (target < matrix[left][newMid]) {max = newMid - 1;} else if (target > matrix[left][newMid]) {min = newMid + 1;} else {return true;}}} else {if (target == matrix[0][0]) {return true;} else {return false;}}return false;}

其他解法:. - 力扣(LeetCode)

116. 寻找峰值 ② √-

峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞ 。

你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

示例 1:

输入:nums = [1,2,3,1]输出:2
解释:3 是峰值元素,你的函数应该返回其索引 2。

示例 2:

输入:nums = [1,2,1,3,5,6,4]
输出:1 或 5 
解释:你的函数可以返回索引 1,其峰值元素为 2;或者返回索引 5, 其峰值元素为 6。

提示:

  • 1 <= nums.length <= 1000
  • -231 <= nums[i] <= 231 - 1
  • 对于所有有效的 i 都有 nums[i] != nums[i + 1]

方法1:(0ms)

    public int findPeakElement(int[] nums) {if (nums.length == 1){return 0;}if (nums.length == 2){if (nums[0] > nums[1]){return 0;}else {return 1;}}int max = 0;for (int i = 1; i < nums.length - 1; i++) {if (nums[i] > nums[i - 1]){if (nums[i] > nums[i + 1]){return i;}else {max = i;}}}return max;}

方法2:(0ms)

    public int findPeakElement(int[] nums) {int left = 0, right = nums.length - 1;for (; left < right; ) {int mid = left + (right - left) / 2;if (nums[mid] > nums[mid + 1]) {right = mid;} else {left = mid + 1;}}return left;}作者:画手大鹏
链接:https://leetcode.cn/problems/find-peak-element/solutions/6695/hua-jie-suan-fa-162-xun-zhao-feng-zhi-by-guanpengc/

117. 搜索旋转排序数组 ②

118. 在排序数组中查找元素的第一个和最后一个位置 ② √

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:

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

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

方法1:(0ms)

    public static int[] searchRange(int[] nums, int target) {int left = 0;int right = nums.length - 1;int[] res = new int[]{-1,-1};while (left <= right){int mid = (left + right) / 2;if (target < nums[mid]){right = mid - 1;}else if (target > nums[mid]){left = mid + 1;}else {int i = mid, j = mid;while (i > -1 && nums[i] == target){i--;}res[0] = ++i;while (j < nums.length && nums[j] == target){j++;}res[1] = --j;return res;}}return res;}

119. 寻找寻钻排序数组中的最小值 ②

120. 寻找两个正序数组的中位数 ③

136. 直线上最多的点数 ③

相关文章:

  • 【数据结构】单链表详解
  • 【C语言】—— 指针三 : 参透数组传参的本质
  • 记录一下在Pycharm中虚拟环境的创建
  • Spring Cloud Alibab 入门搭建,包含Nacos中心,注册服务发现服务,Feign请求,GateWay网关,sentinel限流
  • 2024/03/19(网络编程·day5)
  • 推免保研夏令营/预推免面试记录—北大软微
  • Linux基础开发工具之yum与vim
  • 【Jenkins】data stream error|Error cloning remote repo ‘origin‘ 错误解决【亲测有效】
  • K8s 集群高可用master节点ETCD挂掉如何恢复?
  • 学习vue3第五节(reactive 及其相关)
  • 计算机原理
  • 面试官:你说说Kafka是怎么保证消息可靠性的
  • 网络原理(3)——TCP协议
  • vue 中 清除form 校验状态
  • 关于继承是怎么样的?那当然是很好理解之
  • 30秒的PHP代码片段(1)数组 - Array
  • 4个实用的微服务测试策略
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • ES6核心特性
  • Git的一些常用操作
  • Go 语言编译器的 //go: 详解
  • js中forEach回调同异步问题
  • laravel5.5 视图共享数据
  • php面试题 汇集2
  • rabbitmq延迟消息示例
  • session共享问题解决方案
  • Terraform入门 - 3. 变更基础设施
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 从setTimeout-setInterval看JS线程
  • 检测对象或数组
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 设计模式走一遍---观察者模式
  • 通过npm或yarn自动生成vue组件
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​香农与信息论三大定律
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (C#)获取字符编码的类
  • (C语言)字符分类函数
  • (二开)Flink 修改源码拓展 SQL 语法
  • (二十三)Flask之高频面试点
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)平衡树
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .bashrc在哪里,alias妙用
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查