【leetcode】二分搜索题目总结

704. 二分查找

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

278. 第一个错误的版本

// The API isBadVersion is defined for you.
// bool isBadVersion(int version);class Solution {
public:int firstBadVersion(int n) {int left = 1, right = n;while (left <= right) {int mid = left + (right - left) / 2;if (!isBadVersion(mid)) {left =  mid + 1; } else {right = mid - 1;}}return left;}
};

977. 有序数组的平方

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int len = nums.size();int left = 0, right = len - 1;vector<int> res(len);for (int i = len - 1; i >= 0; --i) {int leftVal = nums[left] * nums[left];int rightVal = nums[right] * nums[right];if (leftVal > rightVal) {res[i] = leftVal;left++;} else {res[i] = rightVal;right--;}}return res;}
};

35. 搜索插入位置

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid  = left + (right - left) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {right = mid - 1;}}// 二分没有找到插入的位置, 那么target 一定小于 left, 从left 位置插入既能满足题解。return left;}
};

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

class Solution {
public:int leftBound(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid  = left + (right - left) / 2;if (nums[mid] == target) {right = mid - 1;} else if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {right = mid - 1; }}// left越界,则不存在if (left >= nums.size()) {return -1;}return nums[left] == target ? left : -1;}int rightBound(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {int mid  = left + (right - left) / 2;if (nums[mid] == target) {left = mid + 1;} else if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {right = mid - 1; }}// right越界,则不存在if (right < 0) {return -1;}return nums[right] == target ? right : -1;}vector<int> searchRange(vector<int>& nums, int target) {if (nums.empty()) {return vector<int>({-1, -1});}int left = leftBound(nums, target);int right = rightBound(nums, target);return vector<int>({left, right});}
};

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

旋转排序数组需要 和 right对比

class Solution {
public:int findMin(vector<int>& nums) {int left= 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == nums[right]) {left = mid + 1;} else if (nums[mid] > nums[right]) {left = mid + 1;} else if (nums[mid] < nums[right]) {right = mid;}}return nums[right];}
};

33. 搜索旋转排序数组

寻找最小值的下标,分段处理,注意边界

旋转排序数组需要 和 right对比

class Solution {
public:int findMin(vector<int>& nums) {int left= 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == nums[right]) {left = mid + 1;} else if (nums[mid] > nums[right]) {left = mid + 1;} else if (nums[mid] < nums[right]) {right = mid;}}return right;}int bsearch(vector<int>& nums, int left, int right, int target) {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 if (nums[mid] == target) {return mid;}}return -1;}int search(vector<int>& nums, int target) {int minIndex = findMin(nums);if (minIndex == 0) {return bsearch(nums, minIndex, nums.size() - 1, target);} else if (nums[0] < target) {return bsearch(nums, 0, minIndex - 1, target);} else if (nums[0] > target) {return bsearch(nums, minIndex, nums.size() - 1, target);} else {return 0;}}
};

直接二分查找,注意边界

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

74. 搜索二维矩阵

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size();int n = matrix[0].size();int low = 0, high = m * n - 1;while (low <= high) {int mid = low + (high - low) / 2;int val = matrix[mid / n][mid % n];if (val == target) {return true;} else if (val < target) {low = mid + 1;} else {high = mid - 1;}}return false;}
};

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

class Solution {
public:double getKth(vector<int>& nums1, int start1, int end1, vector<int>& nums2, int start2, int end2, int k) {int len1 = end1 - start1 + 1;int len2 = end2 - start2 + 1;if (len1 > len2) {return getKth(nums2, start2, end2, nums1, start1, end1, k);}if (len1 == 0) {return nums2[start2 + k - 1];}if (k == 1) {return min(nums1[start1], nums2[start2]);}// 每次减少k/2int mid1 = start1 + min(len1, k / 2) - 1;int mid2 = start2 + min(len2, k / 2) - 1;if (nums1[mid1] < nums2[mid2]) {return getKth(nums1, mid1 + 1, end1, nums2, start2, end2, k - (mid1 - start1 + 1));} else {return getKth(nums1, start1, end1, nums2, mid2 + 1, end2, k - (mid2 - start2 + 1));}}double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int m = nums1.size();int n = nums2.size();int k1 = (m + n + 1) / 2;int k2 = (m + n + 2) / 2;return (getKth(nums1, 0, m - 1, nums2, 0, n - 1, k1) + getKth(nums1, 0, m - 1, nums2, 0, n - 1, k2)) * 0.5;}
};

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

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

相关文章

GitOps实践之Argo CD凭什么脱颖而出?

文章目录 ArgoCD 的诞生ArgoCD 的特点开发者友好的 DashboardArgoCD支持多租户支持多集群可配置漂移检测支持垃圾回收其他特性ArgoCD 和 FluxCDArgo 生态Argo WorkflowsArgo RolloutsArgo EventArgo AutopilotArgo Image updaterArgo ApplicationSetArgoCD OperatorArgo CD Not…

【全网最全】2024五一数学建模B题前四问代码多种保奖进阶思路+建模过程+代码+数据处理+论文写作技巧等(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;这是获取资料的入口&#xff01; 【全网最全】2024五一数学建模B题前四问代码多种保奖进阶思路建模过程代码数据处理论文写作技巧等&#xff08;后续会更新&#xff09;「首先来看看目前已有…

LeetCode 94.二叉树的中序遍历

题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root [1] …

R语言学习—1—将数据框中某一列数据改成行名

将数据框中某一列数据改成行名 代码 结果

观察者模式实战:解密最热门的设计模式之一

文章目录 前言一、什么是观察者模式二、Java实现观察者模式2.1 观察者接口2.2 具体观察者2.3 基础发布者2.4 具体发布者2.5 消息发送 三、Spring实现观察者模式3.1 定义事件类3.2 具体观察者3.3 具体发布者3.4 消息发送 总结 前言 随着系统的复杂度变高&#xff0c;我们就会采…

vivado Aurora 8B/10B IP核(9)- CRC、 Aurora 8B/10B内核的时钟接口端口

CRC 模块提供 16 位或 32 位 CRC&#xff0c;用于用户数据。 Aurora 8B/10B 内核的时钟接口端口 从相邻收发器四边形的时钟Xilinx 实现工具可以根据需要对南北路由和引脚交换到收发器时钟输入进行必要的调整&#xff0c;以将时钟从一个四线到另一个。 重要信息&#xff1a;共…

Python实现类似于Qt的信号、槽

使用Python实现一个类似Qt的信号、槽函数的class class Signal:def __init__(self, *arg_types):self.__subscribers []self.__arg_types arg_typesdef connect(self, func):self.__subscribers.append(func)def disconnect(self, func):try:self.__subscribers.remove(func)…

⑥ - 后端工程师通识指南

📖 该文隶属 程序员:职场关键角色通识宝典✍️ 作者:哈哥撩编程(视频号同名) 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者🏆 推荐专栏: 🏅 程序员:职场关键角色通识宝典🏅

踏上R语言之旅:解锁数据世界的神秘密码(五)

线性与非线性模型及R使用 文章目录 线性与非线性模型及R使用一、数据的分类与模型选择1.变量的取值类型 二、广义线性模型广义线性模型概述Logistic模型 总结 一、数据的分类与模型选择 1.变量的取值类型 因变量记为y&#xff0c;解释变量记为x1&#xff0c;x2,… 因变量y一般…

第三节课,功能2:开发后端用户的管理接口-- postman--debug测试

一、如何使用postman 网址&#xff1a; https://www.postman.com/downloads/ 【Postman小白教程】五分钟学会如何使用Postman~_哔哩哔哩_bilibili postman安装使用_bowser agent在postman哪里-CSDN博客 二、下载后 登录&#xff0c;开始测试 2.1 关于postman 报错&#…

MTEB - Embedding 模型排行榜

文章目录 关于 MTEBMTEB 任务和数据集概览使用 MTEB Pythont 库Installation使用 关于 MTEB MTEB : Massive Text Embedding Benchmark github : https://github.com/embeddings-benchmark/mtebhuggingface : https://huggingface.co/spaces/mteb/leaderboardpaper : https:/…

【Java EE】CAS原理和实现以及JUC中常见的类的使用

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

asyncionetworkxFuncAnimation学习--动态显示计算图的运行情况

asyncio&networkx&FuncAnimation学习--动态显示计算图的运行情况 一.效果二.代码 一.目的 1.动态显示计算图的运行状态(点或边是否已完成) 二.步骤: 1.定义计算图 2.asyncio 并行计算 3.networkx 显示计算图 4.FuncAnimation 动态更新 三.依赖: conda install pygraphv…

数据结构--栈与队列【您的关注是我创作的动力!】

文章目录 栈什么是栈&#xff1f;栈的具体实现 队列什么是队列&#xff1f;队列的实现 栈 什么是栈&#xff1f; 栈也是顺序表的一种&#xff0c;栈的逻辑实现是先进后出&#xff08;后进先出&#xff09;就跟子弹夹一样。 具体逻辑就是它只允许在固定的一端进行数据的插入与…

PHP源码_最新Ai对话系统网站源码 ChatGPT+搭建教程+前后端

基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代码&#xff0c;写论…

【KTips】在Kotlin中实现一个十分简单的自循环状态机

在平日的编码生活中&#xff0c;你有没有遇到过需要通过状态机来实现的逻辑呢&#xff1f;一个状态的轮转、事件订阅的通讯处理等。 状态机的实现方式千变万化&#xff0c;这里我会为你介绍一个简单的自循环状态机实现。 简单介绍 在开始之前&#xff0c;我先说明一下这个所谓…

C# Web控件与数据感应之 CheckBoxList 类

目录 关于数据感应 CheckBoxList 类 范例运行环境 数据源表设计 角色字典表 用户角色表 AutoValueDBList 方法 原理 设计 实现 调用示例 初始化数据 启动查询模式 使用保存模式 小结 关于数据感应 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;We…

PostgreSQL的扩展pgpool

PostgreSQL的扩展pgpool pgpool-II&#xff08;通常简称为 pgpool&#xff09;是一个流行的 PostgreSQL 中间件&#xff0c;广泛用于连接池、负载均衡、自动故障转移等场景。作为一种高级数据库解决方案&#xff0c;pgpool 能够在多个 PostgreSQL 服务器之间分配数据库查询&am…

base64解码时报错“decode base64: invalid input“

现象 用base64 -d 去还原base64编码后的文件时报错decode base64: invalid input 例如: $ base64 test.zip | base64 -d > test2.zip base64: invalid input $ ll test* -rw-r--r-- 1 user grp 152 19 11:41 test.zip -rw-r--r-- 1 user grp 57 19 11:42 test2.zip解决办…

【Docker学习】docker version查看版本信息

就像很多应用一样&#xff0c;docker也使用version来查看版本信息。但因为docker包含有不少独立组件&#xff0c;version的作用范围会更广一些。 用法1&#xff1a; docker --version 描述&#xff1a; 输出安装的Docker CLI 的版本号。关于Docker CLI&#xff0c;请访问。 实操…