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

LEETCODE HOT 100 二分查找 C‘s Log

二分查找也是最重要的就是明确自己变换的前提也就是到底是哪个闭哪个开转化成下面这句话可以这么思考关键不在于区间里的元素具有什么性质而是区间外面的元素具有什么性质这个也是我在刷B站的灵神课的时候无意间看到的热一35. 搜索插入位置 - 力扣LeetCode这道题就是对区间到底开不开以及对应的大小符号的一个判断这里我们按照上面的逻辑和左闭右开区间来看1.区间有效进入中点和左右指针的挪动区间有效的意思是这个区间存在左闭右开那么左必须小于右这个区间才成立2.移动中点也就是中点不在区间内但是需要作为区间的最边边上的位置移动左区间的时候这个左指针是中点加一移动右指针这里中点本身就不包含在区间内可以直接等于右跳出循环的时候就是左区间和右区间相遇了【这里不可能存在左区间到右区间的右边去的情况结合上一轮循环进行判断】那么此时返回的就是左指针【右指针也可以】class Solution { int lower_bound2(vectorint nums, int target) { int left 0, right nums.size(); // 左闭右开区间 [left, right) // 区间不为空 while (left right) { // nums[left-1] target // nums[right] target int mid left (right - left) / 2; if (nums[mid] target) { left mid 1; } else { right mid; } } return left; } public: int searchInsert(vectorint nums, int target) { return lower_bound2(nums, target); } };在针对左闭右闭区间的这里为什么不能返回right而必须返回left返回left因为left是“追赶者”它一直试图往右找更大的直到越过边界。不返回right因为right是“排斥者”它一直在把不符合条件 target的数排除在左边。循环结束时它正好停在“最后一个不符合条件的数”上class Solution { int lower_bound(vectorint nums, int target) { int left 0, right (int) nums.size() - 1; // 闭区间 [left, right] while (left right) { // 区间不为空 // nums[left-1] target // nums[right1] target int mid left (right - left) / 2; if (nums[mid] target) { left mid 1; } else { right mid - 1; } } return left; } public: int searchInsert(vectorint nums, int target) { return lower_bound(nums, target); } };74. 搜索二维矩阵 - 力扣LeetCode矩阵的每一行是递增的且每行的第一个数大于前一行的最后一个数如果把矩阵每一行拼在一起我们可以得到一个递增数组【闭区间写法】class Solution { public: bool searchMatrix(vectorvectorint matrix, int target) { int m matrix.size(), n matrix[0].size(); int left 0, right m * n - 1; // left right区间有效 while (left right) { int mid left (right - left) / 2; // 将一维坐标映射回二维坐标 // 假设 n 是列数 int x matrix[mid / n][mid % n]; if (x target) { return true; // 找到目标值 } else if (x target) { left mid 1; } else { right mid - 1; } } return false; } };34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣LeetCode“非递减顺序排列”的意思是后面的数要么比前面的大要么和前面的相等依旧左闭右闭class Solution { // lower_bound 返回最小的满足 nums[i] target 的下标 i // 如果数组为空或者所有数都 target则返回 nums.size() // 要求 nums 是非递减的即 nums[i] nums[i 1] int lower_bound(vectorint nums, int target) { int left 0, right (int) nums.size() - 1; // 闭区间 while (left right) { // 不为空 // nums[left-1] target // nums[right1] target int mid left (right - left) / 2; if (nums[mid] target) { right mid - 1; left mid 1; } } // left right1 // nums[left-1] target 而 nums[left] nums[right1] target // left 就是第一个 target 的元素下标 return left; } public: vectorint searchRange(vectorint nums, int target) { int start lower_bound(nums, target); if (start nums.size() || nums[start] ! target) { return {-1, -1}; //没有 target } int end lower_bound(nums, target 1) - 1; return {start, end}; } };33. 搜索旋转排序数组 - 力扣LeetCode这道题的逻辑就是下面一道题加上在有序数组中找到目标值两个结合起来的逻辑重点是判断各种返回的值也就是具体什么时候反馈什么样的值来确定目标这里每个值都独一无二也就是说不存在重复的值为什么返回left 还是上面最粗的字表述的left和right在左闭右闭的关系class Solution { int findMinIndex(vectorint nums) { int left 0; int right nums.size() - 1; // 区间不为空也就是等到leftright时这个值就是最小值 while (left right) { int mid left (right - left) / 2; if (nums[mid] nums[right]) { // 中间 右边 // 说明 mid 还在“大数段”最小点点一定在 mid 的右侧 left mid 1; } else { // 中间 右边 // 说明 [mid, right] 这一段是有序的 // 断点可能是 mid也可能在 mid 左侧 right mid; } } return left; // 此时 left right } int lower_bound(vectorint nums, int left, int right, int target) { while (left right) { int mid left (right - left) / 2; if (nums[mid] target) { right mid - 1; // 范围缩小到 [left, mid-1] } else { left mid 1; // 范围缩小到 [mid1, right] } } // 循环结束时 left right 1 // left 指向的是第一个 target 的位置 return left nums.size() nums[left] target ? left : -1; } public: int search(vectorint nums, int target) { int i findMinIndex(nums); // i 是最小值的下标 if (target nums.back()) { // 目标值比数组的最后一个值大说明在前半段数组更大 // i0说明更大的段没了 if (i 0) return -1; return lower_bound(nums, 0, i - 1, target); } else { //target 在第二段 [i, n-1] return lower_bound(nums, i, nums.size() - 1, target); } } };153. 寻找旋转排序数组中的最小值 - 力扣LeetCode这个旋转几次应该无所谓的反正最后得到一个一段加一段有顺序的数组进行判断就可以了通过mid与左右点的大小判断来判断最小值可能出现在当前数组的左半段还是右半段class Solution { public: int findMin(vectorint nums) { int left 0; int right nums.size()-1; while (leftright){ int mid left (right-left)/2; if(nums[mid]nums[right]){ // mid 在左半段最小值在右边 left mid 1; } else{ // mid 在右半段最小值是 mid 或者在左边 right mid; // mid本身有可能就是答案 } } // 结束时 left right return nums[left]; } };4. 寻找两个正序数组的中位数 - 力扣LeetCodeleft 和 right 是在数组 a 上不断收缩的搜索边界用来锁定最佳切点 i而 i 和 j 则是最终落在两个数组上的分割刻度用来划定左右阵营并确定中位数的位置没有好的办法只能自己用手画去理解为什么是a[i-1]左半边的最大值这i个元素的下标分别是0, 1, ..., i-1那么这堆元素里最后一个最大的那个自然就是下标为i-1的元素。同理a右边的最小值即第i1个元素其下标就是i即a[i]“闭区间”体现在while (left right)和right m上。这意味着我们的切割线i可以取到边界值i可以是 0表示a一个元素都不贡献给左边。此时a[i-1]即a[-1]这就是为什么要用INT_MIN来保护的原因。i可以是 m表示a把所有元素都贡献给左边。此时a[i]即a[m]这就是为什么要用INT_MAX来保护的原因。总体来说就是按照灵神的思路上面当作数组a,下面当作数组b不断地去改变二分的结构class Solution { public: double findMedianSortedArrays(vectorint a, vectorint b) { // a 是较短的数组 if (a.size() b.size()) { swap(a, b); } int m a.size(), n b.size(); int left 0; int right m; // i 可以取到 m int totalLeft (m n 1) / 2; // 左半边总共需要的元素个数 while (left right) { //不为空 int i left (right - left) / 2; // a 数组左边有 i 个元素 int j totalLeft - i; // b 数组左边有 j 个元素ij总长度平均分的一半 // 边界保护防止 i0 或 jn 时越界 int aLeftMax (i 0) ? INT_MIN : a[i - 1]; int bRightMin (j n) ? INT_MAX : b[j]; // a[i-1] 是 a 左边的最大值b[j] 是 b 右边的最小值 // 如果 a 左边的最大值 b 右边的最小值说明 a 分给左边的太多了 if (aLeftMax bRightMin) { right i - 1; // i 太大了往左找 } // 如果 a 左边的最大值 b 右边的最小值说明 i 合法或者还可以更大往右找更大的 i else if (aLeftMax bRightMin) { left i 1; } } // 循环结束时left right // right 是最终的切割位置 ( i) // left 是 right 1 int i right; int j totalLeft - i; // 获取四个关键值注意处理越界 (INT_MIN / INT_MAX) int aLeftMax (i 0) ? INT_MIN : a[i - 1]; // a 左边最大 int bLeftMax (j 0) ? INT_MIN : b[j - 1]; // b 左边最大 int aRightMin (i m) ? INT_MAX : a[i]; // a 右边最小 int bRightMin (j n) ? INT_MAX : b[j]; // b 右边最小 // 计算中位数 if ((m n) % 2 1) { // 奇数取左边的最大值 return max(aLeftMax, bLeftMax); } else { // 偶数取 (左边最大 右边最小) / 2.0 return (max(aLeftMax, bLeftMax) min(aRightMin, bRightMin)) / 2.0; } } };

相关文章:

LEETCODE HOT 100 二分查找 C‘s Log

二分查找也是最重要的就是明确自己变换的前提,也就是到底是哪个闭,哪个开, 转化成下面这句话可以这么思考:关键不在于区间里的元素具有什么性质,而是区间外面的元素具有什么性质,这个也是我在刷B站的灵神课…...

伺服驱动器编码器信号(A+/A-,B+/B-,Z+/Z-)差分接线详解:从高创CDHD2到雷赛L8EC

伺服驱动器编码器差分信号接线实战指南:从原理到避坑 在工业自动化领域,伺服系统的精度和稳定性很大程度上取决于编码器信号的质量。A/A-、B/B-、Z/Z-这些看似简单的差分信号线,却是整个位置反馈系统的命脉。我曾亲眼见过一个价值数十万的生产…...

【仅限头部AI产品团队内部流通】:生成式AI A/B测试SOP 2.3版(含GPT-4o/ Claude-3实测对比模板与统计功效计算器)

第一章:生成式AI应用A/B测试方法论概览 2026奇点智能技术大会(https://ml-summit.org) 生成式AI应用的A/B测试远非传统Web界面实验的简单迁移——其核心挑战在于评估不可预测、多模态、上下文敏感的输出质量,而非仅统计点击率或转化率。需同步度量功能…...

Android 渲染引擎——SurfaceFlinger 合成流程与性能优化

1. SurfaceFlinger 的核心工作机制 SurfaceFlinger 是 Android 图形系统的中枢神经,负责将所有应用界面最终合成到屏幕上。想象它就像一个高效的餐厅后厨,接收各路厨师(应用)做好的菜品(图形缓冲区)&#…...

生成式AI容灾不是加台备用服务器!资深SRE拆解3类典型故障场景下的备份盲区

第一章:生成式AI容灾不是加台备用服务器!资深SRE拆解3类典型故障场景下的备份盲区 2026奇点智能技术大会(https://ml-summit.org) 生成式AI系统容灾的常见误区,是将传统无状态服务的“冷备负载均衡”模型直接套用到大模型推理/微调栈上。然…...

HP iLO4报错自救指南:Embedded Flash/SD-CARD故障的3种修复方案(附详细截图)

HP iLO4嵌入式存储故障深度修复手册:从应急处理到长效预防 当你看到iLO控制台右上角跳出"Self-Test reports a problem with: Embedded Flash/SD-CARD"的红色警告时,服务器管理界面突然变得不可靠——这种场景足以让任何运维人员心跳加速。作为…...

从广播星历到精密星历与钟差:GNSS数据文件格式解析与应用场景

1. GNSS数据文件入门:从广播星历到精密产品 刚接触GNSS数据处理时,我完全被各种文件格式搞晕了——brdc、sp3、clk这些后缀名就像天书。直到有次项目定位误差超标,才发现用错星历文件会导致厘米级误差。今天我们就用最直白的语言,…...

3.2 Java 运算符(字符串和字符的加操作)

一、核心概念在 Java 中, 运算符 不仅仅用于数值相加,它还具有 字符串拼接功能。 当表达式中包含 String 类型时, 会优先执行 字符串拼接 操作。关键点: 只要有一个操作数是 String,整个表达式就变成字符串拼接&#x…...

【C 语言系统入门教程】第 14 讲:深入理解指针 (4) | 零基础学习笔记

【C 语言系统入门教程】第 14 讲:深入理解指针 (4) | 零基础学习笔记 前言 本讲是指针进阶收官篇,聚焦字符指针、数组指针、二维数组传参、函数指针、函数指针数组、转移表六大高阶指针知识点,彻底打通 C 语言指针的最后壁垒,是…...

第17届蓝桥杯C语言B组省赛题目

2026年4月11日#include <stdio.h>int main() {long long N 2026202520242023;long long ans 0;for (long long i 0; i < 1013101260121012; i){if (N-i > i){ans;}else{return 0;}}printf("%lld", ans);return 0; }#include <stdio.h>long long…...

测试报告革命:用数据讲故事的艺术

在软件测试领域&#xff0c;一份标准的测试报告往往呈现为冰冷数据的堆砌&#xff1a;缺陷总数、严重等级分布、测试用例通过率、自动化覆盖率……这些数字精确地度量了测试活动&#xff0c;却常常在向产品经理、技术总监或业务方汇报时&#xff0c;遭遇尴尬的沉默。当汇报者逐…...

折腾Cursor这几周,我才发现之前编辑器都用错了

折腾Cursor这几周&#xff0c;我才发现之前编辑器都用错了 上个月还在用Codex的时候&#xff0c;朋友就天天安利Cursor。我心想不就是个套壳VS Code吗&#xff0c;能用出什么花来。 结果上周闲得无聊&#xff0c;装了一个试了试。 真香。 不是那种“哇好厉害”的感叹&#…...

Java全栈工程师面试实录:从技术到业务的深度解析

Java全栈工程师面试实录&#xff1a;从技术到业务的深度解析 1. 开场白 面试官&#xff1a;你好&#xff0c;很高兴见到你。我是负责技术评估的面试官&#xff0c;今天我们会围绕你的技术能力、项目经验以及对业务的理解来展开交流。你可以先简单介绍一下自己。 应聘者&#xf…...

2025最权威的AI论文助手横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek AI开题报告工具借助自然语言处理以及知识图谱技术&#xff0c;能够迅速剖析研究领域的热点之…...

长推理不一定更强:北航 × 字节提出SAGE-RL,挖出大模型隐藏天赋

大模型其实“心里有数”&#xff0c;天生具备高效推理的潜能。论文标题&#xff1a;Does Your Reasoning Model Implicitly Know When to Stop Thinking?研究团队&#xff1a;北航字节跳动联合研究论文地址&#xff1a;https://arxiv.org/abs/2602.08354项目主页&#xff1a;h…...

Houdini流体进阶:巧用VDB与Collision Source实现复杂容器碰撞(含静态对象设置)

Houdini流体进阶&#xff1a;巧用VDB与Collision Source实现复杂容器碰撞&#xff08;含静态对象设置&#xff09; 在影视级流体特效制作中&#xff0c;最令人头疼的莫过于液体与复杂几何体的交互问题。当你的咖啡需要流过一个镂空的金属滤网&#xff0c;或是红酒要注入造型奇特…...

避开这些坑,你的华为机考也能多拿100分:通软开发三道真题拆解与刷题策略

华为通用软件开发机考高分攻略&#xff1a;三道经典题型深度解析与实战技巧 第一次参加华为机考的程序员小王盯着屏幕上的三道题目&#xff0c;手指悬在键盘上方却迟迟敲不下去。距离考试结束还有40分钟&#xff0c;他的第一题代码已经反复修改了五次仍无法通过测试用例。这种场…...

告别自签名警告!用mkcert 1.4.1为本地开发环境一键搞定HTTPS证书(Windows/Linux保姆级教程)

告别自签名警告&#xff01;用mkcert 1.4.1为本地开发环境一键搞定HTTPS证书&#xff08;Windows/Linux保姆级教程&#xff09; 在本地开发Web应用时&#xff0c;HTTPS环境已经成为现代开发的标配需求。无论是测试PWA应用的Service Worker&#xff0c;调试OAuth 2.0授权流程&a…...

Python实战:打造高效GUI工具,实现BLF与ASC格式CAN数据的批量互转

1. 为什么汽车工程师需要BLF与ASC格式转换工具 在汽车电子开发和测试过程中&#xff0c;CAN总线数据记录是最基础也最重要的工作之一。工程师们每天都要处理大量的CAN日志文件&#xff0c;这些文件可能来自不同的测试设备、不同的软件工具&#xff0c;格式也各不相同。其中BLF&…...

超越Grad-CAM:用大核卷积论文技巧可视化你的CNN感受野(含Colab链接)

超越Grad-CAM&#xff1a;大核卷积时代的感受野可视化实战指南 当31x31大卷积核重新成为计算机视觉领域的热门话题时&#xff0c;我们突然发现传统可视化工具已经难以准确捕捉这种"巨无霸"卷积的真实感知能力。去年发表在CVPR上的突破性论文《Scaling Up Your Kernel…...

直播推流避坑指南:为什么你的抖音直播总卡顿?可能是选错了流类型

直播推流避坑指南&#xff1a;为什么你的抖音直播总卡顿&#xff1f;可能是选错了流类型 最近帮几个主播朋友排查直播卡顿问题&#xff0c;发现80%的案例都栽在同一个坑里——推流类型选择错误。明明用的是旗舰级设备&#xff0c;千兆宽带&#xff0c;OBS参数也调得飞起&#x…...

图卷积神经网络3-空域卷积:从GNN到PGC,核心思想与演进脉络解析

1. 空域图卷积的诞生背景 传统图像卷积操作在规则网格数据上表现出色&#xff0c;但当面对社交网络、分子结构这类不规则图数据时就会遇到根本性障碍。想象一下城市交通规划&#xff1a;图像处理就像在整齐的棋盘格上部署红绿灯&#xff0c;而图数据处理则要处理北京胡同里错综…...

RabbitMQ 延迟消息实现:两种方案全解析(TTL+死信 / 延迟插件)实战教程

RabbitMQ 延迟消息实现&#xff1a;两种方案全解析&#xff08;TTL死信 / 延迟插件&#xff09;实战教程前言一、延迟消息基础认知&#xff1a;延迟消息是什么&#xff1f;1.1 定义1.2 典型业务场景1.3 延迟消息流程图&#xff08;通用&#xff09;二、RabbitMQ 实现延迟消息的…...

它不是那种“堆配置”的开发板, 更像是冲着“能直接拿来干活”去的

做嵌入式这些年&#xff0c;大家都有一个感受&#xff0c;现在最贵的&#xff0c;不是芯片&#xff0c;是时间。以前选开发板&#xff0c;很简单&#xff1a;能跑 Linux、接口够用、资料能找到就行&#xff0c;自己要亲自把所有软件硬件都跑一遍&#xff0c;代码甚至都要逐行过…...

RabbitMQ 死信队列(DLX)全面解析:是什么、工作流程、应用场景与实战配置

RabbitMQ 死信队列&#xff08;DLX&#xff09;全面解析&#xff1a;是什么、工作流程、应用场景与实战配置前言一、死信队列基础认知&#xff1a;什么是死信队列&#xff08;DLX&#xff09;&#xff1f;1.1 官方定义1.2 什么是“死信”&#xff1f;1.3 死信队列完整工作流程图…...

AI逆向|使用AI分析aws-waf-token值的加密并纯算

关注它&#xff0c;不迷路。本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请联系作者立即删除&#xff01;一.目标地址https://www.imdb.com/二.抓包分析打开控制台后&#xff0c;抓包分析…...

RabbitMQ 消息 TTL 配置:消息过期时间设置全攻略(两种方案+流程图+实战代码)

RabbitMQ 消息 TTL 配置&#xff1a;消息过期时间设置全攻略&#xff08;两种方案流程图实战代码&#xff09;前言一、TTL 基础认知&#xff1a;什么是消息 TTL&#xff1f;1.1 TTL 定义1.2 核心作用1.3 TTL 消息流转流程图二、RabbitMQ 配置 TTL 的两种方式三、方式一&#xf…...

Windows Server 2012上IIS配置全攻略:从开启功能到发布第一个网页(附防火墙设置)

Windows Server 2012 IIS配置实战&#xff1a;从零部署企业级Web服务 在企业内部搭建测试环境或部署小型应用时&#xff0c;Windows Server 2012依然是一个稳定可靠的选择。作为微软服务器操作系统家族的重要成员&#xff0c;其内置的IIS&#xff08;Internet Information Serv…...

别再傻傻分不清了!从光线投射到路径追踪,一张图看懂光线追踪的进化史

从光线投射到路径追踪&#xff1a;计算机图形学的光影革命 当你在玩最新3A游戏时&#xff0c;是否曾被逼真的水面反射和细腻的阴影效果震撼&#xff1f;这背后是光线追踪技术数十年的演进成果。本文将带你穿越时空&#xff0c;从1960年代的光线投射开始&#xff0c;一步步解析光…...

保姆级避坑指南:在ROS Kinetic上从源码编译TurtleBot3仿真包(含Gazebo环境变量报错解决)

从零构建TurtleBot3仿真环境&#xff1a;ROS Kinetic深度避坑实战 第一次在ROS Kinetic上手动编译TurtleBot3仿真包时&#xff0c;我盯着屏幕上CMake报出的turtlebot3_msgs not found错误发了半小时呆。官方Wiki看似步骤清晰&#xff0c;但实际操作中那些未提及的依赖关系和环境…...