二分查找刷题总结

news/2025/11/23 22:01:30/文章来源:https://www.cnblogs.com/lliujiang/p/19249721

推荐使用闭区间的方式去做二分查找的题目

如果数量比较少,那么建议使用顺序遍历的方式

因此二分结束时一定有: i指向首个大于 target 的元素,j指向首个小于 target 的元素。易得当数组不包含 target 时,插入索引为

162. 寻找峰值

寻找最大值,这个也可以理解,嗯

大的一侧为什么一定有峰值?注意题目条件,在题目描述中出现了 nums[-1] = nums[n] = -∞,这就代表着 只要数组中存在一个元素比相邻元素大,那么沿着它一定可以找到一个峰值

沿着大的方向走,肯定会存在一个峰值

class Solution {public int findPeakElement(int[] nums) {int l = 0, r = nums.length - 1;while (l < r) {int mid = l + ((r - l) >> 1);if (nums[mid] < nums[mid + 1]) {l = mid + 1;} else {r = mid;}}return l;}
}

33. 搜索旋转排序数组

我们将数组从中间分开成左右两部分的时候,一定有一部分的数组是有序的

当前 mid 为分割位置分割出来的两个部分 [l, mid] 和 [mid + 1, r] 哪个部分是有序的,并根据有序的那个部分确定我们该如何改变二分查找的上下界,因为我们能够根据有序的那部分判断出 target 在不在这个部分:

  • 如果 [l, mid - 1] 是有序数组,且 target 的大小满足 [nums[l],nums[mid]),则我们应该将搜索范围缩小至 [l, mid - 1],否则在 [mid + 1, r] 中寻找。
  • 如果 [mid, r] 是有序数组,且 target 的大小满足 [nums[mid+1],nums[r]],则我们应该将搜索范围缩小至 [mid + 1, r],否则在 [l, mid - 1] 中寻找。

public int search(int[] nums, int target) {int lo = 0, hi = nums.length - 1, mid = 0;while (lo <= hi) {mid = lo + (hi - lo) / 2;if (nums[mid] == target) {return mid;}if (nums[mid] >= nums[lo]) { // left到mid是有序数据if (target >= nums[lo] && target < nums[mid]) {hi = mid - 1;} else {lo = mid + 1;}} else { // mid --> right是有序数组if (target > nums[mid] && target <= nums[hi]) {lo = mid + 1;} else {hi = mid - 1;}}}return -1;
}

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

ACE了

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

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

解题总结:

1、边界条件判断

2、如果单调的,直接返回第一个元素即可

3、动态调整small,当前最small为nums[0]

4、如果大于=small,那么缩小左边的边界

5、如果小于small,那么缩小右边的边界,然后更新small的值

6、最后循环结束的时候,l就指向第一个大于=small的元素。

class Solution {public int findMin(int[] nums) {int l = 0;int r = nums.length - 1;if (nums.length == 1) {return nums[0];}if (nums[0] < nums[nums.length - 1]) {return nums[0];}int small = nums[0];while(l <= r) {int m = (l + r) / 2;if (nums[m] >= small) {l = m + 1;} else {r = m - 1;small = nums[m];}}return nums[l];}
}

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

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

相关文章

Solution Set #1

\(1\) 个 set 有 \(10\) 道题。 A. CF1874D Jellyfish and Miku 设 \(f_i\) 为 \(i\to n\) 的期望步数。那么有 \(f_0=f_1+1\),\(f_n=0\),和 \(f_i=f_{i+1}\times \frac{a_{i+1}}{a_i+a_{i+1}}+f_{i-1}\times \frac{…

zjoi2019 语言

好题好题。 我们先对一个结点 \(u\) 进行分析。 发现能对 \(u\) 产生贡献的所有结点可以构成一个联通分量。 只有经过 \(u\) 才会对 \(u\) 产生贡献。 而我们不可能将一条链上的所有点都扔到 \(u\) 上,这显然不现实,…

Java基础(代码块,内部类,函数式编程,常用API,GUI编程)

Java基础(代码块,内部类,函数式编程,常用API,GUI编程) 代码块静态代码块:static 类加载时自动执行,由于类只会执行一次,所有静态代码块也只会执行一次 完成类的静态资源初始化 比main方法先加载。实例代码块:…

python: 把png的透明背景转为指定颜色

一,代码: import base64 import numpy as np from PIL import Image import io from PIL import Image, ImageFilter from io import BytesIOdata_url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAA…

代码源2025长训_noip

NOIP 11/4 Day 1 A 题解:题读错浪费 2h。注意到其实题目给定了每个点的所有出边的编号可能。这也就是说只要我们从叶子节点开始,由于叶子节点的度数为 \(1\) 则那条边一定会确定。那么我们如果从叶子开始往上转移,每…

PySpark - PCA

PySpark - PCA from pyspark.ml.feature import PCApca = PCA(k=2, inputCol=features, outputCol=pca_features) pca_model = pca.fit(df) pca_df = pca_model.transform(df) pca_df.show(truncate=False) +---+-----…

组合博弈 sg函数 Nim游戏的板子默写

简单的取子用sg(x)==0 判断不就可以了吗!!! 所有游戏单个子游戏的思想 1.sg(x)有向无环图上的棋子游戏 每个棋子和它的出边都构成单独的有向无环图 通过一个棋子的所有后继节点我们可以得到这个点的sg ans是所有点的…

详细介绍:Ribbon是如何与服务注册中心nacos交互的

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Day46(16)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02\tlias-web-management

事务管理@Transactional(rollbackFor = {Exception.class})//事务管理的注解 - 默认出现RuntimeException才会回滚 @Override public void save(Emp emp) throws Exception{//1.保存员工的基本信息emp.setCreateTime(L…

完整教程:日本生活-东京新干线乘车经验-流程介绍

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

代码随想录算法训练营第三天:链表part01

代码随想录算法训练营第三天:链表part01**203.移除链表元素 ** leetcode链接:https://leetcode.cn/problems/remove-linked-list-elements/ 题目描述:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所…

2025-07-21-Mon-T-RocketMQ

1. 核心功能 1.1 MQ介绍 RocketMQ基本组件Topic: 消息归类的基本单元 Queue: 消息队列 Producer Consumer ConsumerGroup: NameServer:可以理解为注册中心,负责更新和发现Broker Broker集群:Broker 可以有一个或…

第一章 简介

关于简介这一章,作者简单阐明了CPU,GPU过去的发展,以及它们的差异。除此之外,作者还引入了CUDA,介绍了CUDA的代码类型,以及全书的结构。 此章值得注意的点如下: 1、GPU上的晶体管数量超过CPU上的。 2、两设备之间…

2025-07-13-Sun-T-AI-LangChain4j

1. 认识AI 1.1 神经元介绍 黑马LangChain4j入门到实战项目: 项目地址 软件架构 前端:静态页面后端框架:SpringbootLangchain4j + Ollama持久化:本地文件存储对话记录 (resources/memory) 用户预约信息存储在内存(…

P24_现有网络模型的使用及修改

P24_现有网络模型的使用及修改24.1 VGG16网络模型: (1)打开pytorch(0.9.0)—torchvision.models—VGG(2)参数点击查看代码 pretrained (bool) – If True, returns a model pre-trained on ImageNet progress (bo…

20232403 2025-2026-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 主要内容:使用ARP扫描和nmap进行主机发现与端口扫描、Vsftpd后门漏洞获得root权限、Samba命令注入漏洞获取系统访问、Java RMI反序列化漏洞建立Meterpreter会话、PHP CGI参数注入漏洞。 掌握Metasploit命令…

第二讲类神经网络训练不起来

第二讲类神经网络训练不起来 一.优化失败的原因梯度为0有可能是local minima 和saddle point 因为计算优化的终止条件是梯度为0,但有可能梯度为0仅是局部最小值local minima或鞍点saddle point(多维,在某些维度是最…

【计算机网络】深入浅出DNS:网络世界的地址簿与导航系统 - 教程

【计算机网络】深入浅出DNS:网络世界的地址簿与导航系统 - 教程2025-11-23 21:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

2025-01-24-Fri-T-如何做一个开源项目

创建和维护一个开源项目是一个非常有意义的工作,它可以帮助你与全球开发者合作,同时建立个人或团队的影响力。以下是详细步骤,帮你从零开始创建一个成功的开源项目。 1. 确定项目目标 解决实际问题:选择一个对你或…

利用大语言模型分析技术支持诈骗Facebook群组的网络犯罪研究

本文介绍了一项利用大语言模型分析Facebook上技术支持诈骗群组的研究,涉及38万条帖子的分类分析,揭示了网络犯罪服务的运作模式和最新趋势。网络犯罪与刑罚:我们在APWG eCrimes会议上关于技术支持诈骗Facebook群组的…