【算法练习】leetcode算法题合集之二分查找篇

二分查找

LeetCode69.x的平方根

LeetCode69.x的平方根

只要小于等于就可以满足条件了。

class Solution {public int mySqrt(int x) {int left = 0, right = x;int ans = -1;while (left <= right) {int mid = (right - left) / 2 + left;if ((long) mid * mid <= x) {ans = mid;left = mid + 1;} else {right = mid - 1;}}return ans;}
}

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

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

二分查找获取元素的左边界

左边界是可能不存在的。

当target==nums[mid],继续在左边寻找更合适的mid

寻找大于等于target的元素。如果有等于的元素,是可以返回的。如果有大于的元素,返回的结果是mid+1。

class Solution_LC34 {public int[] searchRange(int[] nums, int target) {int start = lowerBounds(nums, target);if (start == nums.length || nums[start] != target) {return new int[]{-1, -1};}int end = lowerBounds(nums, target + 1) - 1;return new int[]{start, end};}private int lowerBounds(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = (right - left) / 2 + left;if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return left;}
}

二维矩阵类

LeetCode74.搜索二维矩阵

LeetCode74.搜索二维矩阵

找到最后一个不大于target的元素。比如[1,10,23],target是3,获取到的元素为1。

等于直接获取low,进行二分的时候获取(high-low+1)/2。存在low=1,high=2,low一直为1的情况。

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int rowIndex = binarySearchFirstCol(matrix, target);if (rowIndex < 0 || rowIndex >= matrix.length) {return false;}return binarySearchRow(matrix[rowIndex], target);}private int binarySearchFirstCol(int[][] matrix, int target) {int low = -1, high = matrix.length - 1;while (low < high) {int mid = low + (high -low+1 ) / 2;if (matrix[mid][0] > target) {high = mid - 1;} else {low = mid;}}return low;}private boolean binarySearchRow(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = (right - left) / 2 + left;if (nums[mid] > target) {right = mid - 1;} else if (nums[mid] < target) {left = mid + 1;} else {return true;}}return false;}
}

LeetCode240.搜索二维矩阵II

LeetCode240.搜索二维矩阵II

class Solution {public boolean searchMatrix(int[][] matrix, int target) {for (int[] nums : matrix) {if (binarySearch(nums, target)) {return true;}}return false;}private boolean binarySearch(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = (right - left) / 2 + left;if (nums[mid] > target) {right = mid - 1;} else if (nums[mid] < target) {left = mid + 1;} else {return true;}}return false;}
}

数组从左下角向右上方向移动,向上是变小,向右是变大。

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int i = matrix.length - 1, j = 0;while (i >= 0 && j < matrix[0].length) {if (matrix[i][j] > target) {i--;} else if (matrix[i][j] < target) {j++;} else {return true;}}return false;}

旋转数组类

LeetCode33.搜索旋转排序数组

寻找中间元素,判断是否找到;mid元素不是目标元素,判断mid元素是否在左升区间,如果在,判断目标元素是否在[left,mid],缩小范围。

class Solution {public int search(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = (right - left) / 2 + left;if (nums[mid] == target) {return mid;}// left到mid之间是有序的。if (nums[mid] >= nums[left]) {if (target >= nums[left] && target < nums[mid]) {right = mid - 1;} else {left = mid + 1;}} else {if (target > nums[mid] && target <= nums[right]) {left = mid + 1;} else {right = mid - 1;}}}return -1;}
}

LeetCode153.搜索旋转数组的最小值(**)

LeetCode153.搜索旋转数组的最小值

二分查找我原本以为很简单,但是里面的细节真的很多。

while (left <= right) 的终止条件是left>right,进行left = mid + 1;后nums[left]的性质就改变了。

nums[mid] == nums[left],到底是修改left还是right,数组中存在两个元素,循环第一次获取到的nums[mid] == nums[left],所以要比较第二遍。

class Solution {public int findMin(int[] nums) {int left = 0, right = nums.length - 1;int ans = Integer.MAX_VALUE;while (left <= right) {int mid = (right - left) / 2 + left;if (nums[mid] >= nums[left]) {ans = Math.min(ans, nums[left]);left = mid + 1;} else {ans = Math.min(ans, nums[mid]);right = mid - 1;}}return ans;}
}

nums[mid]<nums[right],都意味着mid在右边升序段中。所以最小值在[left,mid]之间。

nums[mid] < nums[right]小于是符合条件的,所以right = mid;大于等于是不符合条件的,所以要 mid + 1

测试用例:数组[2,1],发现2>1, left边界更新,当跳出循环,low变成相对大的元素。

数组升序 left–x 升序 x–right 升序

比较nums[left]还是nums[right],因为nums[right]相对nums[mid]较大。在升序队列[1,2,3,4,5]中,nums[left]是最小的。比nums[left]大,无法判定最小值在[left,mid]还是[mid,right]之间。

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

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

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

如果小于最右边元素,说明在最小值在[left,mid]

如果大于最右边元素,说明最小值在[mid,right]

如果等于最右边的元素,无法判断,换下一个元素。

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

找极大、极小值

LeetCode162.寻找峰值/极大值

LeetCode162.寻找峰值

判断如果nums[mid] > nums[mid + 1],那么峰值在[left,mid]之间。

如果nums[mid] < nums[mid + 1],峰值在[mid+1,right]之间

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

其他

寻找两个正序数组的中位数(**)

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

class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int length1 = nums1.length;int length2 = nums2.length;int total = length1 + length2;if (total % 2 == 0) {return (getKth(nums1, nums2, total / 2 + 1) + getKth(nums1, nums2, total / 2)) / 2;} else {return getKth(nums1, nums2, total / 2 + 1);}}private double getKth(int[] nums1, int[] nums2, int k) {int length1 = nums1.length;int length2 = nums2.length;int index1 = 0;int index2 = 0;while (true) {// 边界情况if (index1 == length1) {return nums2[index2 + k - 1];}if (index2 == length2) {return nums1[index1 + k - 1];}if (k == 1) {return Math.min(nums1[index1], nums2[index2]);}int i1 = Math.min(nums1.length, k / 2 + index1) - 1;int i2 = Math.min(nums2.length, k / 2 + index2) - 1;int num1 = nums1[i1];int num2 = nums2[i2];if (num1 > num2) {k -= (i2 - index2 + 1);index2 = i2 + 1;} else {k -= (i1 - index1 + 1);index1 = i1 + 1;}}}
}

LeetCode287. 寻找重复数

LeetCode287. 寻找重复数

原地hash修改数组,hash表需要额外空间

如果不允许重复的话,小于等于4的元素个数一定是小于等于4的。因为排序好了的数组4个位置放不下大于4个的元素。

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为 OpenCV 编写文档(二)

常用命令 这里通过简短的示例描述了最常用的 doxygen 命令。有关可用命令的完整列表和详细说明&#xff0c;请访问命令参考。 基本命令 brief - 带有简要实体描述的段落 param - 函数参数的描述。 多个相邻语句合并到一个列表中。如果在实际函数签名中找不到具有此名称的参数…

2024潮乎新年盲盒H5版本可易支付对接

前端三十行和三十一行改成你域名 后台.env文件修改数据库 下载地址&#xff1a;YISHEN源码网

驾驭车联网的力量:深入车联网网络架构

车联网&#xff0c;作为移动互联网之后的新风口&#xff0c;以网联思想重新定义汽车&#xff0c;将其从简单的出行工具演化为个人的第二空间。车联网涵盖智能座舱和自动驾驶两大方向&#xff0c;构建在网联基础上&#xff0c;犀思云多年深度赋能汽车行业&#xff0c;本文将从车…

Qt通用属性工具:随心定义,随时可见(三)

传送门: 《Qt通用属性工具:随心定义,随时可见(一)》 《Qt通用属性工具:随心定义,随时可见(二)》 《Qt通用属性工具:随心定义,随时可见(三)》 一、效果展示 本文将展示的是一个源于Qt但是却有些年头的Qt属性浏览工具。支持交互式编辑和查阅对象属性。 这可不就是妥…

LeetCode、162. 寻找峰值【中等,最大值、二分】

文章目录 前言LeetCode、162. 寻找峰值【中等&#xff0c;最大值、二分】题目及类型思路及代码思路1&#xff1a;二分思路2&#xff1a;寻找最大值 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿…

Filter过滤器、使用场景、使用办法、创建和配置等

这里写目录标题 过滤器应用场景自动登录统一设置编码格式访问权限控制敏感字符过滤 Filter使用Filter的创建和配置 过滤器 过滤器实际上就是对 web资源进行拦截&#xff0c;做一些处理后再交给下一个过滤器或 servlet处理通常都是用来拦截request进行处理的&#xff0c;也可以…

2023年全球软件质量效能大会(QECon深圳站):核心内容与学习收获(附大会核心PPT下载)

随着科技的快速发展&#xff0c;软件行业面临着越来越多的挑战和机遇。为了更好地应对这些挑战&#xff0c;不断提升软件的质量和效能&#xff0c;大会将汇聚全球的软件开发者、架构师和项目经理&#xff0c;共同探讨和分享关于软件质量保证、测试、性能优化、用户体验设计、人…

使用nginx搭建网页

一、实验要求 网站需求&#xff1a; 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于www.openlab.com/student 网站访问学生信息&#xff0c;www.openlab.com…

【GAMES101】Lecture 08 着色频率

目录 着色频率 Flat shading&#xff08;平面着色&#xff09; Gouraud shading&#xff08;顶点着色&#xff09; Phong shading&#xff08;像素着色&#xff09; 如何计算法线 着色频率 大家可以看到下面这三个球是看起来不一样的是吧&#xff0c;但是其实这三个球用的…

Qt/C++自定义界面大全/20套精美皮肤/26套精美UI界面/一键换肤/自定义颜色/各种导航界面

一、前言 这个系列对应自定义控件大全&#xff0c;一个专注于控件的编写&#xff0c;一个专注于UI界面的编写&#xff0c;程序员有两大软肋&#xff0c;一个是忌讳别人说自己的程序很烂很多bug&#xff0c;一个就是不擅长UI&#xff0c;基本上配色就直接rgb&#xff0c;对于第…

c++:基于c语言基础上的语法不同(1)

前言&#xff1a;此篇文章适合学完c语言基础概念的同学&#xff0c;是帮助c向c语言的同学快速掌握基本语法。 基础格式 #include<iostream>using namespace std; int main() {system("pause");return 0; } 输入&#xff1a; cin>>a;//a是输入内容 输出…

vue基于Spring Boot的中医在线学习课程购买服务管理系统

SpinrgBoot的主要优点有&#xff1a; 1、为所有spring开发提供了一个更快、更广泛的入门体验&#xff1b; 2、零配置&#xff1b; 3、集成了大量常用的第三方库的配置&#xff1b; 4、提供准备好的特性。当今&#xff0c;nodejs领域的开发者机会都在使用SpinrgBoot,在开发领域逐…

【探索C++容器:vector的使用和模拟实现】

【本节目标】 1.vector的介绍及使用 2.vector深度剖析及模拟实现 1.vector的介绍及使用 1.1 vector的介绍 vertor文档介绍 1. vector是表示可变大小数组的序列容器。2. 就像数组一样&#xff0c;vector也采用连续存储空间来存储元素。也就是意味着可以采用下标对vector的元…

轻松一刻 浅休息下哈

yum -y install epel-release yum install -y linux_logo cal 此命令以日历表的方式显示日期 curl http://wttr.in 此网站进行在屏幕上面显示天气情况

Linux下安装docker

1、查看系统版本 Docker支持64位版本的CentOS 7和CentOS 8及更高版本&#xff0c;它要求Linux内核版本不低于3.10。查看Linux版本的命令这里推荐两种&#xff1a;lsb_release -a或cat /etc/redhat-release。 显然&#xff0c;当前Linux系统为CentOS7。再查一下内核版本是否不低…

关于python环境变量相关的配置汇总(venv虚拟环境/conda环境/pip相关)

关于python环境变量相关的配置汇总(venv虚拟环境/conda环境/pip相关) 本文作者&#xff1a; slience_me 文章目录 关于python环境变量相关的配置汇总(venv虚拟环境/conda环境/pip相关)1. python环境配置相关1.1 系统环境1.2 Anaconda环境相关1.2.1 安装1.2.2 查看python环境 1.…

【软件测试常见Bug清单】

软件测试中&#xff0c;bug的类型有很多种&#xff0c;比如&#xff1a;代码错误、界面优化、设计缺陷、需求补充和用户体验等&#xff1b; 一般情况下&#xff0c;需求补充和设计缺陷比较好区分&#xff0c;但是代码错误、界面优化和用户体验区分不是很明显&#xff1b; 下面…

MySQL存储函数和存储过程练习题

一、创建表的要求 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) 否 否 是 否 否 glass VARCHAR(50) 否 否 是 否 否 sch表内容 id name glass 1 xiaommg …

【GitHub项目推荐--名校课程资源】【转载】

先引用一段话&#xff0c;今天推荐的所有 GitHub 项目创立动机几乎都是这个。本文会盘点清华、北大、斯坦福、中国科学技术大学、上海交大等学校的课程资源。 01. 浙江大学课程共享计划 上图截屏中的话就是出自该项目&#xff0c;浙江大学搞了一个课程共享计划&#xff0c;其…

安装RabbitMQ sentos并挂载

1. usr/local/software/mq/data 创建data目录, mkdir data 2. 拉取镜像 docker pull rabbitmq 3.配置网络 docker network create --driver bridge --subnet172.18.12.0/16 --gateway172.18.1.1 wn_docker_net 4. 设置参数并创建挂载 docker run -it \ --name rabbitmq \…