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

【LeetCode Hot100】二分查找篇

前言

        本文用于整理LeetCode Hot100中题目解答,因题目比较简单且更多是为了面试快速写出正确思路,只做简单题意解读和一句话题解方便记忆。但代码会全部给出,方便大家整理代码思路。

二分相关问题讲解:【基础算法】二分查找的多种写法


35. 搜索插入位置

一句话题意

        给定一个序列和一个目标值,问若目标值存在序列中,则返回下标,否则返回目标值插入有序序列的位置。

一句话题解

        二分查找。

class Solution {public int searchInsert(int[] nums, int target) {int l=0;int r=nums.length;while(l<r){int mid=l+r>>1;if(nums[mid]>=target){r=mid;}else{l=mid+1;}}return r;}
}

74. 搜索二维矩阵

一句话题意

        给定一个每行递增,每行最后一个值大于下一行第一个值得二维矩阵,问目标值是否在矩阵中。

一句话题解

        两次二分,先去最后一列二分查目标值所在行,然后在所在行查所在列。

class Solution {int n,m;int target;int[][] matrix;public boolean searchMatrix(int[][] matrix, int target) {this.n=matrix.length;this.m=matrix[0].length;this.target=target;this.matrix = matrix;int x = searchY(m-1);if(x==n)x--;int y = searchX(x);if(y==m)y--;return matrix[x][y]==target;}int searchX(int x){int l=0;int r=m;while(l<r){int mid=l+r>>1;if(matrix[x][mid]<target){l=mid+1;}else{r=mid;}}return r;}int searchY(int y){int l=0;int r=n;while(l<r){int mid=l+r>>1;if(matrix[mid][y]<target){l=mid+1;}else{r=mid;}}return r;}
}

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

一句话题意

        顾名思义,在排序数组中查找元素的第一个和最后一个位置。

一句话题解

        实现lower_bound和upper_bound。

class Solution {public int[] searchRange(int[] nums, int target) {int l=lowBs(nums,target);if(l==nums.length||nums[l]!=target){return new int[]{-1,-1};}if(l==nums.length-1){return new int[]{l,l};}return new int[]{l,highBs(nums,target)-1};}int lowBs(int[] nums,int target){int l=0;int r=nums.length;while(l<r){int mid=l+(r-l>>1);if(nums[mid]<target){l=mid+1;}else{r=mid;}}return l;}int highBs(int[] nums,int target){int l=0;int r=nums.length;while(l<r){int mid=l+(r-l>>1);if(nums[mid]<=target){l=mid+1;}else{r=mid;}}return l;}
}

33. 搜索旋转排序数组

一句话题意

        有序数组吗,在顺时针旋转了一定范围,求目标值是否存在数组中。

一句话题解

        二分。可以注意到的是,我们在进行二分的时候,一定是有一半的序列是有序的,那么我们可以根据这个特点,去分类判断即可。

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

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

一句话题意

        求旋转后的有序序列中的最小值。

一句话题解

        二分,可以发现的是,在我们旋转之后,我们二分的中间元素若大于右侧元素,那我们可以判断出最小值应该在mid的右侧;否则在左侧。

        本质上就是找小的递增序列的位置。

class Solution {public int findMin(int[] nums) {int l = 0;int r = nums.length - 1;while (l < r) {int mid = l + (r - l >> 1);if (nums[mid] < nums[r]) {r = mid;} else {l = mid + 1;}}return nums[l];}
}

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

一句话题意

        给定两个有序序列,问两个有序序列组合成一个组合序列后的中位数是什么。

一句话题解

参考题解:【图解】循序渐进:从双指针到二分 -- 灵茶山艾府

        要求复杂度最大O(log(n+m)),可以观察到我们通过将序列中的值分为相同数量的两部分,左边取最大值,右侧取最小值,就能取得中位数。以此,我们可以将两个序列根据不同的序列划分点,算出当左侧最大值小于右侧最小值的时候,是满足条件的,也就是可以正确取得中位数。据此,我们可以进行二分。

class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {if(nums1.length>nums2.length){int[] tmp=nums1;nums1=nums2;nums2=tmp;}int n=nums1.length;int m=nums2.length;int l=-1;int r=n;while(l+1<r){int midt=l+(r-l>>1);int midb=(m+n+1>>1)-midt-2;if(nums1[midt]<=nums2[midb+1]){l=midt;}else{r=midt;}}int i=l;int j=(m+n+1>>1)-i-2;int mxt=Integer.MIN_VALUE;int mxb=Integer.MIN_VALUE;int mnt=Integer.MAX_VALUE;int mnb=Integer.MAX_VALUE;if(i>=0)mxt=nums1[i];if(j>=0)mxb=nums2[j];if(i+1<n)mnt=nums1[i+1];if(j+1<m)mnb=nums2[j+1];if((n+m)%2==0){return (Math.min(mnt,mnb)+Math.max(mxt,mxb))/2.0;}else{return Math.max(mxb,mxt);}}
}

相关文章:

  • 【Go类库分享】mcp-go Go搭建MCP服务
  • 将Airtable导入NocoDB
  • Python functools.partial 函数深度解析与实战应用
  • 【C/C++】Linux的futex锁
  • 音视频开发技术总结报告
  • 小土堆pytorch数据加载概念以及实战
  • StandardCopyOption 还有哪些其他可用的常量?
  • 为什么要做异地监控组网?
  • 洛谷P6136 【模板】普通平衡树(数据加强版)
  • quantization-大模型权重量化简介
  • 【LLaMA-Factory实战】Web UI快速上手:可视化大模型微调全流程
  • Python 学习
  • react18基础速成
  • mysql安装,操作详解,适用于所有版本
  • 神经网络基础-从零开始搭建一个神经网络
  • Python实例题:Python获取房天下数据
  • 【算法基础】快速排序算法 - JAVA
  • 2025年斯诺克世锦赛——“75三杰”在1/4决赛作为对手的概率
  • 论面向方面编程及其应用
  • VITA STANDARDS LIST,VITA 标准清单下载
  • 谢承祥已任自然资源部总工程师
  • 路遇交通事故镇干部冲进火海救人,已申报见义勇为
  • 五四青年节|青春韵脚
  • 观察|印度购买“阵风”舰载机,为掌控印度洋加速升级海航装备
  • 五一假期上海多个景点人流如织,警方多措并举确保秩序
  • “矿茅”国际化才刚开始?紫金矿业拟分拆境外黄金矿山资产于港交所上市