算法及数据结构系列 - 二分查找

系列文章目录

算法及数据结构系列 - BFS算法


文章目录

  • 二分查找
    • 框架思路
    • 经典题型
      • 二分查找
      • 寻找左侧边界
      • 寻找右侧边界
    • 刷题
      • 875. 爱吃香蕉的珂珂
      • 1011. 在 D 天内送达包裹的能力
      • 392. 判断子序列

二分查找

框架思路

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

计算 mid 时需要防止溢出,代码中 left + (right - left) / 2 就和 (left + right) / 2 的结果相同,但是有效防止了 left 和 right 太大直接相加导致溢出。

经典题型

二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

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

寻找左侧边界

注意: 当 val 不存在时,得到的索引恰好是比 val 大的最小元素索引

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

寻找右侧边界

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

刷题

875. 爱吃香蕉的珂珂

珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。

珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。

珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。

返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。

提示: 吃每一堆分别要几小时;寻找左侧边界

class Solution {public int minEatingSpeed(int[] piles, int H) {Arrays.sort(piles);int left = 1, right = piles[piles.length - 1] + 1;while(left < right){int mid = left + (right - left)/2;if(canFinish(mid, piles, H)){right = mid;}else{left = mid + 1;}}return left;}public boolean canFinish(int k, int[] piles, int H){long tmpHour = 0;for(int i = 0; i< piles.length;i++){tmpHour += (long)(piles[i] / k);if(piles[i] % k > 0){tmpHour ++;}}if(tmpHour <= H){return true;}else{return false;}}
}

1011. 在 D 天内送达包裹的能力

传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。

传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。

返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。

示例:

输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5
输出:15
解释:
船舶最低载重 15 就能够在 5 天内送达所有包裹,如下所示:
第 1 天:1, 2, 3, 4, 52 天:6, 73 天:84 天:95 天:10请注意,货物必须按照给定的顺序装运,因此使用载重能力为 14 的船舶并将包装分成 (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) 是不允许的。 s
class Solution {public int shipWithinDays(int[] weights, int D) {if(weights.length == 0){return 0;}int len = weights.length;int left = weights[0], right = (weights[0] + weights[len -1]) * len / 2 + 1;while(left < right){int mid = left + (right - left)/2;if(canFinish(weights, D, mid)){right = mid;}else{left = mid + 1;}}return left;}public boolean canFinish(int[] w, int D, int cap){int i = 0;for (int day = 0; day < D; day++) {int maxCap = cap;while ((maxCap -= w[i]) >= 0) {i++;if (i == w.length)return true;}}return false;}
}

392. 判断子序列

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

class Solution {public boolean isSubsequence(String s, String t) {int fromIndex = 0;for(int i = 0; i < s.length(); i++){char tmp = s.charAt(i);int j = fromIndex;for(; j < t.length(); j++){if(t.charAt(j) == tmp){fromIndex = j + 1;break;}}if(j == t.length()){return false;}}return true;}
}

后续挑战 :

如果有大量输入的 S,称作S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?

class Solution {public boolean isSubsequence(String s, String t) {int m = s.length(), n = t.length();ArrayList<Integer>[] index = new ArrayList[256];// 先记下 t 中每个字符出现的位置for (int i = 0; i < n; i++) {char c = t.charAt(i);if (index[c] == null) index[c] = new ArrayList<>();index[c].add(i);}int j = 0; // t 上的指针// 借助 index 查找 s[i]for (int i = 0; i < m; i++) {char c = s.charAt(i);// 整个 t 压根儿没有字符 cif (index[c] == null) return false;int pos = find(index[c], j);// 二分搜索区间中没有找到字符 cif (pos == index[c].size()) return false;// 向前移动指针 jj = index[c].get(pos) + 1;}return true;}public int find(ArrayList<Integer> arr, int target){int left = 0, right = arr.size();while(left < right){int mid = left + (right - left)/2;if(arr.get(mid) == target){right = mid;}else if (arr.get(mid) > target){right = mid;}else {left = mid + 1;}}return left;}
}

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

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

相关文章

【AI论文】DeepMesh:基于强化学习的自回归艺术家网格创建

摘要&#xff1a;三角形网格在3D应用中扮演着至关重要的角色&#xff0c;能够实现高效的操作和渲染。虽然自回归方法通过预测离散的顶点标记来生成结构化的网格&#xff0c;但它们往往受到面数限制和网格不完整性的约束。为了应对这些挑战&#xff0c;我们提出了DeepMesh框架&a…

基于ArcGIS和ETOPO-2022 DEM数据分层绘制全球海陆分布

第〇部分 前言 一幅带有地理空间参考、且包含海陆分布的DEM图像在研究区的绘制中非常常见&#xff0c;本文将实现以下图像的绘制 关键步骤&#xff1a; &#xff08;1&#xff09;NOAA-NCEI官方下载最新的ETOPO-2022 DEM数据 &#xff08;2&#xff09;在ArcGIS&#xff08;…

Unity | 游戏数据配置

目录 一、ScriptableObject 1.创建ScriptableObject 2.创建asset资源 3.asset资源的读取与保存 二、Excel转JSON 1.Excel格式 2.导表工具 (1)处理A格式Excel (2)处理B格式Excel 三、解析Json文件 1.读取test.json文件 四、相关插件 在游戏开发中,策划…

docker模拟Dos_SYN Flood拒绝服务攻击 (Ubuntu20.04)

目录 ✅ 一、实验环境准备&#xff08;3 个终端&#xff09; &#x1f449; 所以最终推荐做法&#xff1a; 2️⃣ 配置 seed-attacker 为攻击者&#xff0c;开启 telnet 服务&#xff1a; 3️⃣ 配置 victim-10.9.0.5 为受害者服务器&#xff0c;开启 telnet 客户端并监听&…

场外个股期权是什么?场外个股期权还能做吗?

场外个股期权指在非正式的交易场所&#xff0c;即场外市场上&#xff0c;老板们与特定对手方直接进行的个股期权交易。 场外期权为何被严监管&#xff1f; 场外个股期权指在非正式的交易场所&#xff0c;即场外市场上&#xff0c;老板们与特定对手方直接进行的个股期权交易&am…

vulnhub靶场【billu系列】之billu_b0x2靶机

前言 靶机&#xff1a;billu_b0x2靶机&#xff0c;IP地址为192.168.10.10 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 靶机和攻击机都采用VMware虚拟机&#xff0c;都采用桥接网卡模式 文章涉及的靶机及工具&#xff0c;都可以自行访问官网或者项目地址进行获取…

高性能边缘计算网关-高算力web组态PLC网关

高性能EG8200Pro边缘计算算力网关-超强处理能力 样机申请测试&#xff1a;免费测试超30天&#xff08;https://www.iotrouter.com/prototype/&#xff09; 产品主要特点和特色功能 设备概览与连接能力 设备型号&#xff1a;EG8200P。主要特点&#xff1a; 支持多种工业协议&am…

数据可信安全流通实战,隐语开源社区Meetup武汉站开放报名

隐语开源社区 Meetup 系列再出发&#xff01;2025 年将以武汉为始发站&#xff0c;聚焦"技术赋能场景驱动"&#xff0c;希望将先进技术深度融入数据要素流转的各个环节&#xff0c;推动其在实际应用场景中落地生根&#xff0c;助力释放数据要素的最大潜能&#xff01…

避坑指南 | 阿里云服务器centos7上MySQL部署优化指南

目录 1 检查阿里云是否安装mysql 1.1使用 rpm 命令 1.2检查 MySQL 服务状态 2 卸载mysql 2.1停止 MySQL 服务 2.2 检查已安装的 MySQL 包 2.3 卸载 MySQL 包 2.4 删除 MySQL 数据和配置文件 2.5 清理残留的依赖包 2.6 验证卸载 2.7 &#xff08;可选&#xff09;删除…

位运算--求二进制中1的个数

位运算–求二进制中1的个数 给定一个长度为 n 的数列&#xff0c;请你求出数列中每个数的二进制表示中 1 的个数。 输入格式 第一行包含整数 n。 第二行包含 n 个整数&#xff0c;表示整个数列。 输出格式 共一行&#xff0c;包含 n 个整数&#xff0c;其中的第 i 个数表…

Go语言的基础类型

一基础数据类型 一、布尔型&#xff08;Bool&#xff09; 定义&#xff1a;表示逻辑真 / 假&#xff0c;仅有两个值&#xff1a;true 和 false内存占用&#xff1a;1 字节使用场景&#xff1a;条件判断、逻辑运算 二、数值型&#xff08;Numeric&#xff09; 1. 整数类型&…

SpringBoot整合MQTT最详细版(亲测有效)

一、导入pom.xml依赖 <!--mqtt依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId></dependency><dependency><groupId>org.springframework.in…

记一次发短信接口分析

忘记密码接口 数据包 GET /api/weatherforcast/user/send/17777777777 HTTP/2 Host: Cookie: SECKEY_ABVKd1GnERPtEFYSs7fL9W7VzoxAG0rjit7K8hAiMGIySpo522Wig70mdKRZQlvXNuqUTh9sBTWXG6XJ7miFZtA%3D%3D; Hm_lvt_018467e59f9d76a72cdbed870456819b1742445251,1742456927,1742…

dfs刷题排列问题 + 子集问题 + 组和问题总结

文章目录 一、排列问题全排列II题解代码 优美的排列题解代码 二、子集问题字母大小写全排列题解代码 找出所有子集的异或总和再求和题解代码 三、组合问题电话号码的字母组合题解代码 括号生成题解代码 组合题解代码 目标和题解代码 组合总和题解代码 总结 一、排列问题 全排列…

【AVRCP】蓝牙链路控制器(LC)与AVRCP互操作性要求深度解析

目录 一 、Link Controller&#xff08;LC&#xff09;概述 1.1 LC的定义与功能 1.2 LC在蓝牙技术中的重要性 二、Link Controller&#xff08;LC&#xff09;互操作性要求 2.1 互操作性要求概述 2.2 物理层互操作性要求 2.3 链路管理互操作性要求 2.4 其他互操作性要求…

go + vscode + cline +qwen 快速构建 MCP Server

go 编译自定义 mcp tool current time tool 代码 package mainimport ("context""fmt""time""github.com/mark3labs/mcp-go/mcp""github.com/mark3labs/mcp-go/server" )func main() {// Create MCP servers : server.New…

C语言-动态内存管理

1.为什么要有动态内存分配 我们现如今已经掌握的内存开辟方式有 int main() {int a 0;int arr[30] { 0 };return 0; } 这两种方式&#xff0c;但是这种开辟空间的方式有两个特点&#xff1a; 1.空间开辟大小是固定的 2.数组在申明的时候&#xff0c;必须指定数组的长度&…

Java复习

在开篇前首先申明一下&#xff0c;本文虽不够系统&#xff0c;但复习够用&#xff0c;尤其是快速回忆( •̀ ω •́ )✧与提问。 主打一个速度。 本文将会从Java的基础语法、面向对象、API、字符串、集合、进阶...等六方面讲起。 一、Java的基础语法&#xff1a; 1、Java入门…

Vue+ElementUI 字符串数组标签化展示组件

一. 效果 数据&#xff1a;‘[“苹果”,“香蕉”]’ 可添加&#xff0c;编辑&#xff0c;删除。 二. 组件源码 <template><div><div v-for"(item, index) in items":key"index"><el-inputv-if"inputVisible && ed…

识别并脱敏上传到deepseek/chatgpt的文本文件中的身份证/手机号

本文将介绍一种简单高效的方法解决用户在上传文件到DeepSeek、ChatGPT,文心一言,AI等大语言模型平台过程中的身份证号以及手机号等敏感数据识别和脱敏问题。 DeepSeek、ChatGPT,Qwen,Claude等AI平台工具快速的被接受和使用,用户每天上传的文本数据中潜藏着大量敏感信息,…