当前位置: 首页 > 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);}}
}

http://www.xdnf.cn/news/264583.html

相关文章:

  • Swift:重构开发范式的现代编程语言
  • 《高性能MySQL》第1讲:MySQL架构
  • 音视频开发技术总结报告
  • 对比表格:数字签名方案、密钥交换协议、密码学协议、后量子密码学——密码学基础
  • 3.0/Q1,Charls最新文章解读
  • batch normalization和layer normalization区别
  • 循环缓冲区
  • QNAP Duplicati 备份 123云盘
  • Java接口全面教程:从入门到精通
  • ai之paddleOCR 识别PDF python312和paddle版本冲突 GLIBCXX_3.4.30
  • C与指针4——指针
  • 每天一道面试题@第五天
  • 第九课认识倍数
  • 【C++】模板进阶
  • C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 20)
  • 多协议 Tracker 系统架构与传感融合实战 第四章 IMU 与 UWB 传感融合框架
  • 基于Springboot旅游网站系统【附源码】
  • 步进电机中断函数解释
  • rhce第二次作业
  • 工作记录 2015-06-01
  • fastapi+vue中的用户权限管理设计
  • Seata RM的事务提交与回滚源码解析
  • 六大机器学习算法全解析:企业级开发实战与深度理解
  • AWS云服务深度技术解析:架构设计与最佳实践
  • Android Compose 物联网(IoT)UI 组件库封装指南
  • Dev-C++下载安装使用教程
  • 单细胞测序数据分析流程的最佳实践
  • Java学习手册:关系型数据库基础
  • 爬虫准备前工作
  • 【AI面试准备】NLP解析API文档生成测试脚本