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

hot100——二分查找

4.寻找两个正序数组的中位数解题思路首先题目中已经说明是正序那么nums1以及nums2中都是从小到大进行排列的又因为题目中要求时间复杂度为O(log(mn))一般看到这种时间复杂度是O(log……)形式的基本上就要想到二分法。那么我们开始划分这两个数组首先我们要确保nums1的数组长度nums2数组的长度因为我们之后是在nums1数组上遍历这样的话在较短的数组内部进行遍历时间复杂度比较小。对于数组nums1nums2,取中间i, j一般中位数的话左边和右边是相同的但是如果数组长度是奇数的话那么左边的长度比右边的要大1。对于nums1nums2取中间ij;那么左半部分就是nums1[0,……i-1] nums2[0,……,j-1]右半部分就是nums1[i,……m] nums2[j,……, n]对于这些部分需要满足左边的最大值小于等于右边的最小值也即nums1[i-1] num2[j]nums2[j-1] nums1[i]如果nums1[i-1] nums2[j]说明nums1左半部分的最大值竟然大于nums2右半部分的最小值说明i值大了应该把nums1[i-1]往左移nums2[j]往右移这样确保nums1[i-1]变小nums2[j]变大同理如果nums2[j-1] nums1[i]说明nums2左半部分的最大值竟然大于nums1右半部分的最小值说明i值小了应该把nums2[j-1]往左移nums1[i]往右移这样确保nums2[j-1]变小nums1[i]变大。代码pythonclass Solution(object): def findMedianSortedArrays(self, nums1, nums2): :type nums1: List[int] :type nums2: List[int] :rtype: float m , n len(nums1), len(nums2) if m n : return self.findMedianSortedArrays(nums2, nums1) left, half, right 0 , (mn1)//2, m while left right: i (left right) // 2 j half - i left1 nums1[i-1] if i 0 else float(-inf) right1 nums1[i] if i m else float(inf) left2 nums2[j-1] if j 0 else float(-inf) right2 nums2[j] if j n else float(inf) if left1 right2 and left2 right1: if (mn) % 2 1: return max(left1, left2) else: return (max(left1, left2) min(right1, right2)) / 2.0 elif left1 right2: right i - 1 else: left i 1 return 0.0Cclass Solution { public: double findMedianSortedArrays(vectorint nums1, vectorint nums2) { int m nums1.size(); int n nums2.size(); // 让二分在数组长度小的数组内进行降低时间复杂度 if(m n) return findMedianSortedArrays(nums2, nums1); int total m n; // 取一半的数作为左边一般左边数量右边当总数为奇数的时候左边比右边多一个中位数 int half (total1)/2; int left 0; int right m; while(left right) { int i (left right) / 2; int j half - i; // 取nums1一半的数作为左半边, nums2一半的数作为左半边 // 取nums1一半的数作为右半边nums2一半的数作为右半边 int left1 (i 0? nums1[i-1] : INT_MIN); int right1 (i m? nums1[i] : INT_MAX); int left2 (j 0? nums2[j-1] : INT_MIN); int right2 (j n? nums2[j] : INT_MAX); if(left1 right2 left2 right1) { if(total%21) return max(left1, left2); else return (max(left1, left2)min(right1,right2))/2.0; } else if(left1 right2) // nums1左边的最大值竟然大于nums2右边的最小值不合理说明i大了应该减小 right i - 1; else // nums2左边的最大值竟然大于nums1右边的最小值不合理说明i小了应该增大 left i 1; } return 0.0; } };33.搜索旋转排序数组解题思路首先我们从题目中已知整个数组在未旋转之前是升序排序的经旋转后不是升序的了题目中要求时间复杂度是O(logn)一看到整个logn这就让我们想起了二分法。我们知道在旋转后数组中旋转后的部分和没旋转的部分都是升序排列的比如[0,1,2,4,5,6,7]下标3上向左旋转后可能变为[4,5,6,7,0,1,2]。旋转后的部分[4, 5, 6, 7] 以及 [0, 1, 2]都是升序排列的。我们取left0, right len(nums)-1,mid (leftright)/2把整个数组分成2部分一部分是[left, mid)一部分是(mid, right]。返回条件是nums[mid] target, return mid随后判断这俩部分是否是升序。如果nums[left] nums[mid]则说明左半部分是有序的之后再判断target是否是在整个左半部分nums[left]target target nums[mid]如果条件成立则说明target在左半部分那么right mid - 1;反之则说明target在右半部分left mid 1反之上述条件不成立则说明右半部分是有序的之后再判断target是否是在右半部分nums[mid]target target nums[right]如果条件成立则说明target在右半部分那么left mid 1;反之则说明target在左半部分right mid - 1;反之则说明该target不存在。代码pythonclass Solution(object): def search(self, nums, target): :type nums: List[int] :type target: int :rtype: int left, right 0, len(nums) - 1 while left right: mid (left right) // 2 if nums[mid] target: return mid # 左半部分升序 if nums[left] nums[mid]: # target在左半边 if nums[left] target and target nums[mid]: right mid - 1 # target在右半边 else: left mid 1 # 右半部分升序 else: # target在右半边 if nums[mid] target and target nums[right]: left mid 1 # target在左半边 else: right mid - 1 return -1Cclass Solution { public: int search(vectorint nums, int target) { int left 0; int right nums.size() - 1; while(left right) { // mid取left 和 right的中间数 int mid (right left) / 2; // 当nums[mid] target时返回mid if(nums[mid] target) return mid; // 二分法分为2部分判断左右2部分是否为有序 // 左半部分是升序 if(nums[left] nums[mid]) { // target是在[left, mid)这个区间内 if(nums[left] target target nums[mid]) right mid - 1; // target在(mid, right]这个区间内 else left mid 1; } // 右半部分升序 else { // target是在(mid, right]这个区间内 if(nums[mid] target target nums[right]) left mid 1; // target在[left, mid)这个区间内 else right mid - 1; } } return -1; } };34.在排序数组中查找元素的第一个和最后一个位置解题思路首先题目中说了目前我们的数组是非递减顺序排列的数组其实要求时间复杂度是O(logn)可知该题应该用到二分法。因为target在数组中可能不止一个与target相等的数值题目中也要求了返回给定目标值在数组当中的开始位置以及结束位置所以我们需要找到数组最左边以及最右边和target相等的数值的下标然后返回对应的下标列表。二分法查找左边界当我们找到nums[mid]target时不立即返回而是向左继续查找等于target的数返回对应的下标。初始化left0, rightlen(nums)-1. return -1;当leftright时mid (leftright) // 2;判断nums[mid]target?条件成立则说明mid左侧确实是可能有和target相等的数存在那么right mid - 1条件不成立则说明mid右侧可能存在和target相等的数那么缩小左边界left mid 1循环结束后left就是最后一个target的值比较nums[left] target来判断是否返回left。二分法查找右边界当我们找到nums[mid]target时不立即返回而是向右继续查找等于target的数返回对应的下标。初始化left0, rightlen(nums)-1. return -1;当leftright时mid (leftright) // 2;判断nums[mid]target?条件成立则说明mid右侧确实是可能有和target相等的数存在那么left mid 1条件不成立则说明mid左侧可能存在和target相等的数那么缩小右边界right mid - 1循环结束后right就是最后一个target的值比较nums[right] target来判断是否返回right。代码pythonclass Solution(object): def searchRange(self, nums, target): :type nums: List[int] :type target: int :rtype: List[int] left self.findleft(nums, target) if left -1: return [-1, -1] right self.findright(nums, target) return [left, right] # 往target左边找找到最左边的target下标 def findleft(self, nums, target): :type nums: List[int] :type target: int :rtype: List[int] left, right 0, len(nums) -1 while left right: mid (left right) // 2 # 左边还可能有target if nums[mid] target: right mid - 1 # 收缩左边界 else: left mid 1 if (left len(nums)) and (nums[left] target): return left return -1 # 往target右边找找到最右边的target下标 def findright(self, nums, target): :type nums: List[int] :type target: int :rtype: List[int] left, right 0, len(nums) -1 while left right: mid (left right) // 2 # 右边还可能有target if nums[mid] target: left mid 1 # 收缩右边界 else: right mid - 1 if (right 0) and (nums[right] target): return right return -1Cclass Solution { public: // 找到最左边等于target的下标 int findleft(vectorint nums, int target) { int left 0; int right nums.size() - 1; while(left right) { int mid (left right) / 2; if(nums[mid] target) // 说明左边可能还有和target相等的数 right mid - 1; else //缩小左边界 left mid 1; } if(left nums.size() nums[left] target) return left; return -1; } // 找到最右边等于target的下标 int findright(vectorint nums, int target) { int left 0; int right nums.size() - 1; while(left right) { int mid (left right) / 2; if(nums[mid] target) // 说明右边可能还有和target相等的数 left mid 1; else //缩小右边界 right mid - 1; } if(right 0 nums[right] target) return right; return -1; } vectorint searchRange(vectorint nums, int target) { int left findleft(nums, target); if(left -1) return {-1, -1}; int right findright(nums, target); return {left, right}; } };240.搜索二维矩阵II解题思路首先从题目中我们可以得知矩阵是每一行从左到右升序排列每一列的元素从上到下升序排列。因此我们取矩阵的右上角元素和target进行比对如果右上角元素和target相同则返回True如果右上角元素大于target那么当前列的元素都是大于target的那么只能往左靠因此j - 1如果右上角元素小于target那么当前行的元素都是小于target的那么只能往下靠因此i 1如果这样遍历了整个矩阵都没找到的话就返回false。因此整个时间复杂度是O(mn)。代码pythonclass Solution(object): def searchMatrix(self, matrix, target): :type matrix: List[List[int]] :type target: int :rtype: bool if not matrix or not matrix[0]: return False m, n len(matrix), len(matrix[0]) i, j 0, n-1 while i m and j 0: if matrix[i][j] target: return True elif matrix[i][j] target: j - 1 else: i 1 return FalseCclass Solution { public: bool searchMatrix(vectorvectorint matrix, int target) { int m matrix.size(); int n matrix[0].size(); int i 0; int j n - 1; // 取矩阵的右上角元素开始比对 while(i m j 0) { if(matrix[i][j] target) return true; else if(matrix[i][j] target) j - 1; else i 1; } return false; } };

相关文章:

hot100——二分查找

4.寻找两个正序数组的中位数解题思路首先,题目中已经说明,是正序,那么nums1以及nums2中都是从小到大进行排列的;又因为题目中要求时间复杂度为O(log(mn)),一般看到这种时间复杂度是O(log……)形式的,基本上…...

屠龙刀法35--使用SQL查询器批量生成insert语句

很多网友认为SQL查询器的语句不都是人工输入或者从外面粘贴进去的吗?用查询器批量生成Insert语句感觉有点魔幻哦。的确听起来不太科学,但是对于DBCS来说这个功能的确非常好用。下面我们就举例一步步告诉大家,如何使用这个功能。 第一步&…...

微信JS-SDK分享失败?深度解析“offline verifying”权限验证错误与高效排查指南

还在为微信网页自定义分享功能频繁遭遇“updateAppMessageShareData:fail, the permission value is offline verifying”而头疼?本文将从公众号认证、JS-SDK权限、域名绑定、网络、缓存及API版本六大维度,为您深度剖析此错误成因,并提供一套…...

Wan2.2-I2V-A14B开源大模型:支持ONNX导出与边缘设备轻量化部署探索

Wan2.2-I2V-A14B开源大模型:支持ONNX导出与边缘设备轻量化部署探索 1. 开箱即用的私有部署方案 Wan2.2-I2V-A14B是一款强大的文生视频开源大模型,专为RTX 4090D 24GB显存环境深度优化。这个私有部署镜像已经内置了完整的运行环境和所有必要组件&#x…...

基于MATLAB的VSG逆变器无源性分析与稳定性研究

基于MATLAB的VSG逆变器无源性分析与稳定性研究 摘要 随着分布式发电和微电网技术的快速发展,逆变器作为新能源并网的关键接口,其稳定性问题日益突出。虚拟同步发电机(VSG)控制技术通过模拟同步发电机的机电特性,为逆变器提供惯性和阻尼支撑,成为提升系统稳定性的重要手…...

EdB Prepare Carefully:定制你的RimWorld完美开局体验

EdB Prepare Carefully:定制你的RimWorld完美开局体验 【免费下载链接】EdBPrepareCarefully EdB Prepare Carefully, a RimWorld mod 项目地址: https://gitcode.com/gh_mirrors/ed/EdBPrepareCarefully 是否厌倦了RimWorld随机生成的殖民者团队带来的不确定…...

3种策略实现百度网盘提取码智能解析效率提升85%

3种策略实现百度网盘提取码智能解析效率提升85% 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 副标题:分布式检索技术突破与资源获取效率革命 核心痛点:为何获取提取码成为数字资源流通的主要瓶颈&am…...

COMSOL数值模拟:N2和CO2混合气体在THM热流固三场耦合下增强瓦斯抽采

COMSOL数值模拟,实现N2和CO2混合气体在THM热流固三场耦合情况下增强瓦斯(煤层气抽采)煤层气抽采效率提升这事儿,最近在实验室搞了个骚操作——往煤层里怼氮气和二氧化碳的混合气。说人话就是拿这俩气体当开塞露,把卡在…...

测试用例设计-XMind

🚀 一、XMind 用例设计核心思路👉 和传统Excel不同,XMind强调:以“功能模块”为主干 以“用户场景”为分支 以“测试点”为叶子节点👉 本质结构:模块 → 场景 → 用例点 → 具体测试数据/预期📌…...

不换硬件,速度翻倍:本地 LLM 推理加速实战

同一块 RTX 3090,同一个 70B 模型,推理速度从 30 t/s 提升到 160 t/s,并且不花一分钱。作者 Amar Chetri 博士在这篇文章中介绍了三种纯软件优化技术:speculative decoding、multi-token prediction 和自动化超参数调优&#xff0…...

QRazyBox:5分钟解决二维码修复难题的专业工具

QRazyBox:5分钟解决二维码修复难题的专业工具 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 二维码已经成为现代生活中无处不在的数字桥梁,但你是否遇到过这样的情况&…...

SEO_2024年最新SEO策略与趋势深度解析(352 )

<h2>2024年最新SEO策略与趋势深度解析</h2> <p>在数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;依然是网站流量和品牌影响力的核心驱动力。2024年&#xff0c;随着互联网技术的不断进步&#xff0c;SEO策略和趋势也在不断演变。本文将详细…...

探索粗糙表面波动模型生成:打造不规则之美

粗糙表面&#xff0c;波动模型生成&#xff0c;用于在物体表面生成不规则的粗糙表面&#xff0c;或面表面的波动边界等&#xff0c;可自定义波动分布与赋值。在图形学和模拟领域&#xff0c;生成物体表面的粗糙质感或是波动边界常常是一个有趣又具有挑战性的任务。今天咱们就聊…...

League Akari:5大核心解决方案提升英雄联盟游戏体验

League Akari&#xff1a;5大核心解决方案提升英雄联盟游戏体验 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一…...

Simulink与Plecs联合仿真实现三相桥式电路能量双向流动

simulinkplecs联合仿真源件&#xff0c;三相桥式电路&#xff0c;采用母线电压外环与电流内环控制&#xff0c;可整流也可逆变并网&#xff0c;实现能量双向流动&#xff0c;采用SVPWM调制方式。 1.plecssimulink 2.SVPWM 3.双闭环 支持simulink2022以下版本&#xff0c;联系跟…...

【Java】UTF-8变长编码及其3字节存储奥秘

UTF-8 是一种变长编码&#xff0c;一个字符可能由 1 到 4 个字节组成。 解码时&#xff08;将字节数组转回 String&#xff09;&#xff0c;计算机并不需要“猜”或者去查表&#xff0c;因为长度信息本身就包含在字节的“头部”里。这就是 UTF-8 设计的精妙之处&#xff1a;它是…...

OpenClaw进阶:利用GLM-4.7-Flash实现复杂任务链式执行

OpenClaw进阶&#xff1a;利用GLM-4.7-Flash实现复杂任务链式执行 1. 为什么需要链式任务执行 上周我在整理项目文档时&#xff0c;遇到了一个典型的多步骤任务&#xff1a;需要从十几个Markdown文件中提取关键数据&#xff0c;整理成Excel表格&#xff0c;然后根据内容生成分…...

知识图谱项目实战(基础概念以及工具使用)【第一章】

在RAG以及Agent的应用领域中,知识图谱可以增强知识库的检索效果(通过搭建知识图谱数据库(GraphRag)实现).在教育医疗以及金融领域应用广泛.图谱&#xff08;graph&#xff09;有节点和边组成一.知识图谱理论1.1知识图谱的整体架构1.2知识图谱架构实现流程1. 文本标注(Doccano标…...

Elasticsearch踩坑记录:scaled_float字段查询结果和你想的不一样?

Elasticsearch中的scaled_float&#xff1a;为什么你的查询结果总是不准确&#xff1f; 刚接触Elasticsearch的开发者经常会遇到一个令人困惑的现象&#xff1a;明明存储的是精确的浮点数&#xff0c;查询时却返回了意料之外的结果。这背后往往与scaled_float字段类型的特殊处理…...

经典位运算和计算各进制下的各位数字之和

(num & (num - 1)) 是检测2的幂的经典位运算方法&#xff0c;结果为0即为2的幂 if ((num & (num - 1)) ! 0) 按位与&#xff1a; 0 & 0 0 0 & 1 0 1 & 0 0 1 & 1 1 全 1 才 1&#xff0c;有 0 则 0 int lowbit(int x) { …...

无代码爬虫方案:OpenClaw调度Qwen3.5-9B解析动态网页数据

无代码爬虫方案&#xff1a;OpenClaw调度Qwen3.5-9B解析动态网页数据 1. 为什么需要无代码爬虫&#xff1f; 作为一个经常需要从网页抓取数据的技术博主&#xff0c;我经历过太多抓取数据的痛苦时刻。传统爬虫开发需要处理反爬机制、解析动态加载内容、维护复杂的XPath或CSS选…...

文艺复兴,什么是XSS,常见形式(二)

前言 本文将继续介绍XSS的常见形状&#xff0c;依赖于portswigger提供的免费Lab环境&#xff0c;将重点介绍关于使用脚本来进行表单XSS验证以及针对标签的模糊测试。 Lab: Stored DOM XSS 这是一个存储型的DOM类的XSS&#xff0c;具体的是当你将内容提交到评论区&#xff0c…...

链表合并不解之处

我在做一元多次的方程合并时&#xff0c;在节点函数中定义系数和指数&#xff0c;相当于给你两个La&#xff0c;Lb链表&#xff0c;按照节点中的指数大小排序&#xff0c;对他们系数进行合并。我有两种方式进行编写。题目&#xff1a;第一行包含一个整数 nn&#xff0c;表示第一…...

ViGEmBus如何解决Windows游戏控制器兼容性难题?

ViGEmBus如何解决Windows游戏控制器兼容性难题&#xff1f; 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款专业的Windows内核模式驱动程序&a…...

包装器简介

可调用对象&#xff1a;可以使用&#xff08;&#xff09;运算符进行调用的对象&#xff0c;本质是能像函数一样使用的东西常见课调用对象&#xff1a;函数指针&#xff0c;仿函数&#xff0c;lambda表达式我们能否使用统一的方式对其封装&#xff0c;进行调用&#xff0c;这时…...

如何实现精准歌词同步?KRC格式全解析与应用实践

如何实现精准歌词同步&#xff1f;KRC格式全解析与应用实践 【免费下载链接】KuGouMusicApi 酷狗音乐 Node.js API service 项目地址: https://gitcode.com/gh_mirrors/ku/KuGouMusicApi 在音乐应用开发中&#xff0c;歌词显示功能看似简单&#xff0c;实则隐藏着诸多技…...

OpenClaw任务编排:用Qwen3.5-4B-Claude实现爬虫+分析闭环

OpenClaw任务编排&#xff1a;用Qwen3.5-4B-Claude实现爬虫分析闭环 1. 为什么需要自动化任务编排 去年我接手了一个市场调研项目&#xff0c;需要每周从20多个网站抓取产品价格数据&#xff0c;清洗后生成趋势图表。最初用Python脚本手动Excel处理&#xff0c;每次要花3小时…...

大模型进阶必看:Agent Skills如何让AI开发更标准化、可复用?速收藏!

随着AI应用开发成熟&#xff0c;工具调用经历了Function Calling、MCP协议到Agent Skills三个阶段。Agent Skills通过文件系统原生设计&#xff0c;将指令、工作流和资源打包成可复用模块&#xff0c;革新上下文管理&#xff0c;实现代码即工具&#xff0c;摆脱供应商锁定。它使…...

6种压缩黑科技如何彻底解决文件处理的效率难题

6种压缩黑科技如何彻底解决文件处理的效率难题 【免费下载链接】7-Zip-zstd 7-Zip with support for Brotli, Fast-LZMA2, Lizard, LZ4, LZ5 and Zstandard 项目地址: https://gitcode.com/gh_mirrors/7z/7-Zip-zstd 为何压缩工具总是陷入"速度与压缩率"的两难…...

X-TRACK二次开发终极指南:如何基于开源框架快速扩展新功能

X-TRACK二次开发终极指南&#xff1a;如何基于开源框架快速扩展新功能 【免费下载链接】X-TRACK A GPS bicycle speedometer that supports offline maps and track recording 项目地址: https://gitcode.com/gh_mirrors/xt/X-TRACK X-TRACK是一款支持离线地图和轨迹记…...