news 2026/5/11 23:39:03

【LeetCode 手撕算法】(二分查找)搜索插入位置、搜索二维矩阵、查找数组相同的所有位置、搜索旋转排序数组、旋转升序数组的最小值

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【LeetCode 手撕算法】(二分查找)搜索插入位置、搜索二维矩阵、查找数组相同的所有位置、搜索旋转排序数组、旋转升序数组的最小值

复杂度为O(log n)有序用二分查找

35-搜索插入位置

思路:二分查找,左右指针 求中间值

注意:while的查询条件是>=

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

74-搜索二维矩阵

思路:照常设置左右指针,求出mid ,将mid变成二维数组位置取值,比较大小进行二分查找

注意:while的查询条件是>=

转换二维数组用/列数 %列数

class Solution { public boolean searchMatrix(int[][] matrix, int target) { int left=0; int right=matrix.length*matrix[0].length-1; while(left<=right){ int mid=(left+right)/2; int m=mid/matrix[0].length; int n=mid%matrix[0].length; if(matrix[m][n]==target){return true; } if(matrix[m][n]<target){left=mid+1;} if(matrix[m][n]>target){right=mid-1;} } return false; } }

34-查找数组相同的所有位置

思路:做两遍二分查找,当nums[mid]==target时多走一步 ,向左走就是求左边界,向右走就是求有边界

注意:最后返回要把两个边界值 拼在一个数组里;

while的查询条件是>=

设置返回值 初始为-1 ;

class Solution { public int[] searchRange(int[] nums, int target) { int left=0; int right=nums.length-1; int first=findLeft(nums,left,right,target); int last=findRight(nums,left,right,target); return new int[]{first,last};//结果两个存进数组里 } public int findLeft(int[] nums,int left,int right,int target){ int result=-1; while(left<=right){ int mid=(left+right)/2; if(nums[mid]==target){result=mid;right=mid-1;}//多走一步 if(nums[mid]>target){right=mid-1;} if(nums[mid]<target){left=mid+1;} } return result; } public int findRight(int[] nums,int left,int right,int target){ int result=-1; while(left<=right){ int mid=(left+right)/2; if(nums[mid]==target){result=mid;left=mid+1;}//多走一步 if(nums[mid]>target){right=mid-1;} if(nums[mid]<target){left=mid+1;} } return result; } }

33-搜索旋转排序数组

思路:先求一个中点劈开数组,判断 左或右半有序, 再判断target在左半还是右半

注意:if条件里面的< = > ,三种都要考虑 , 不要忘了=,为避免这种问题,尽量用else做剩下;

target判断左半 还是右半, 要在边界用=,而不是在mid上用,因为mid已经判断过了

class Solution { public int search(int[] nums, int target) { int left=0; int right=nums.length-1; while(left<=right){ int mid=(left+right)/2; if(target==nums[mid]){return mid;}//万一直接命中 //判断左半有序 if(nums[left]<=nums[mid]){ //target在左半 if(nums[left]<=target&&target<nums[mid]){right=mid-1;} else{left=mid+1;} } //判断右半有序 else{ //target在右半 if(nums[mid]<target&&target<=nums[right]){left=mid+1;} else{right=mid-1;} } } return -1; } }

153-旋转升序数组的最小值

思路:取最小值,用left带回; 取mid劈开,判断最小值在左还是右,就两种情况,要么在右(移动左边界), 要么在左 且 最小值之后升序(移动右边界); 依次执行只要出现 左高右低 就,只要出现升序就

注意:是while的条件没有=,=是终止条件,不然mid=left=right就会死循环;

判断最小值在哪一侧的条件不需要 = ,因为所有的数字都不相同

class Solution { public int findMin(int[] nums) { int left=0; int right=nums.length-1; while(left<right){ int mid=(left+right)/2; if(nums[mid]>nums[right]){ //最小值在右侧 left=mid+1; //用left带回最小值,肯定不是mid }else{//正常升序序列 right=mid; } } return nums[left]; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 23:36:58

HCIP VLAN实验

实现vlan配置 划分接口 划分u列表 和T列表 划分IP 划分DHCPPC2 ping PC 4/5/6

作者头像 李华
网站建设 2026/5/11 23:35:27

Claude Code + zread 快速上手老项目实操指南

目标&#xff1a;用 zread 为老项目生成结构化 Wiki&#xff0c;再让 Claude Code 基于 Wiki 查架构、找代码、排问题。中型项目实测&#xff1a;约 90 分钟&#xff0c;花费 9.69&#xff0c;生成 29 页 Wiki。 接手一个陌生老项目&#xff0c;先不要从源码目录开始硬翻。更稳…

作者头像 李华
网站建设 2026/5/11 23:25:19

UniApp引导页最佳实践:用这个市场插件5分钟搞定,告别闪屏Bug

UniApp引导页高效解决方案&#xff1a;5分钟集成与闪屏问题根治指南 第一次打开应用时&#xff0c;那个精美的引导页往往决定了用户对产品的第一印象。但作为开发者&#xff0c;你可能已经受够了引导页开发中的各种坑——从莫名其妙的闪屏到复杂的"仅首次展示"逻辑。…

作者头像 李华
网站建设 2026/5/11 23:24:49

宽带矢量信号MQAM同步分析算法【附代码】

✨ 长期致力于宽带矢量信号分析、MQAM、重采样、定时同步、载波同步研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;并行Farrow结构分数延迟重采样器&a…

作者头像 李华