二分系列(二分查找)9/12

一、分情况讨论

1.左闭右闭:[left,right]

因为是左闭右闭,所以left和right都能直接取到。

#这里将>=放到一起,当nums[mid]>=target的时候,
要更新右边界,right=mid-1,这样就把一些相同的情况也切出去了
可以理解为找的第一个为target的
int left=0;
int right=nums.length-1;
while(left<=right){int mid=left+(right-left)/2;if(nums[mid]<target){left=mid+1;}else{right=mid-1;}
}
return left
2.左闭右开:[left,right)
int left=0;
int right=nums.length;
while(left<right){int mid=left+(right-left)/2;if(nums[mid]<target){left=mid+1;}else{right=mid;}
}
return left||right(两个都行)
3.左开右开:(left,right)
int left=-1;
int right=nums.length;
while(left+1<right){int mid=left+(right-left)/2;if(nums[mid]<target){left=mid;}else{right=mid;}
}
return right
二分查找分为四种类型:

大于,大于等于,小于,小于等于; 这四种类型都可以看作是>=,

如果要查找>target的位置的话,可以看成>=(target+1)的位置

如果是查找<target的位置的话,可以看成>=(target)的位置-1

如果是查找<=target的位置的话,可以看成>(target)的位置-1   又因为>(target)可以看作>=target+1

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

思路一:

排序数组->使用二分。第一个位置:>=; 第二个位置:<=

又因为<=target的话可以先看作>target-1    再看作>=(target+1)-1;

所以直接写一个>=的函数

代码一: 
class Solution {public int[] searchRange(int[] nums, int target) {int[] res=new int[]{-1,-1};int start=findPosition(nums,target);//求大于等于targetif(start==nums.length||nums[start]!=target)return res;int end=findPosition(nums,target+1)-1;//求小于等于targetreturn new int[]{start,end};}public int findPosition(int[] nums,int target){int left=0;int right=nums.length-1;while(left<=right){int mid=left+(right-left)/2;if(nums[mid]<target){left=mid+1;}else{right=mid-1;}}return left;}
}
思路二:

直接使用>=求第一个元素,然后使用<=求最后一个元素,不需要转换了。

代码二:
class Solution {public int[] searchRange(int[] nums, int target) {int[] res = new int[] { -1, -1 };int start = findFirstPosition(nums, target);// 求大于等于targetif (start == nums.length || nums[start] != target)return res;int end = findLastPosition(nums, target );// 求小于等于targetreturn new int[] { start, end };}public int findFirstPosition(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] >= target) {right = mid - 1;} else {left = mid + 1;}}return left;}public int findLastPosition(int[] nums, int target) {int left=0;int right=nums.length-1;while(left<=right){int mid=left+(right-left)/2;if(nums[mid]<=target){left=mid+1;}else{right=mid-1;}}return right;}
}

三、两个数之间的距离值

题意:

给定两个数组nums1,nums2; 请你返回两个元素间的距离值;

距离值 定义为符合此距离要求的元素数目:对于元素 arr1[i] ,不存在任何元素 arr2[j] 满足 |arr1[i]-arr2[j]| <= d 。

思路:

使用二分查找:

1.首先将nums2进行排序;

2.然后找到nums2中>=nums1[i]-d的下标;找到<=nums1[i]+d的下标;将<=看成>=(nums[i]+d+1)-1

3.判断下标是否合规。如果不合规说明不存在;合规说明存在。(0,-1)就不合规

代码:
class Solution {public int findTheDistanceValue(int[] arr1, int[] arr2, int d) {Arrays.sort(arr2);int res=0;for(int num:arr1){int left=num-d;int right=num+d;int start=findIndex(arr2,left);int end=findIndex(arr2,right+1)-1;if(start>end)res++;}return res;}public int findIndex(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] >= target) {right = mid - 1;} else {left = mid + 1;}}return left;}
}

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

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

相关文章

iLogtail采集日志过程

iLogtail 是阿里云日志服务(Log Service)提供的一款轻量级日志采集工具,专门用于 Kubernetes 环境下的日志采集。使用 iLogtail 可以方便地将新 Pod 中的日志数据实时采集并上传至阿里云日志服务中。以下是详细的采集步骤: 1. 准备工作 确保你的 Kubernetes 集群已经安装…

基于深度学习的图像分类或识别系统(含全套项目+PyQt5界面)

目录 一、项目界面 二、代码实现 1、数据集结构 2、设置需要模型的训练参数和指定数据集路径 3、网络代码 4、训练代码 5、评估代码 6、结果显示 三、项目代码 一、项目界面 二、代码实现 1、数据集结构 每一个文件夹对应一个类别的数据 2、设置需要模型的训练参数和…

B+树(B+TREE)索引

一、概念 B树索引是数据库和文件系统中广泛使用的一种索引结构&#xff0c;它是B树的一种变体。B树索引的主要特点是能够加快数据的检索速度&#xff0c;同时保持数据的有序性&#xff0c;便于快速查找、插入、删除和顺序访问数据。下面详细介绍B树索引的特点和工作原理。 1.…

09.20 C++对C的扩充以及C++中的封装、SeqList

SeqList.h #ifndef SEQLIST_H #define SEQLIST_H#include <iostream> #include<memory.h> #include<stdlib.h> #include<string.h>using namespace std;//typedef int datatype; //类型重命名 using datatype int;//封装一个顺序表 class Seq…

app抓包 chrome://inspect/#devices

一、前言&#xff1a; 1.首先不支持flutter框架&#xff0c;可支持ionic、taro 2.初次需要翻墙 3.app为debug包&#xff0c;非release 二、具体步骤 1.谷歌浏览器地址&#xff1a;chrome://inspect/#devices qq浏览器地址&#xff1a;qqbrowser://inspect/#devi…

新媒体运营

一、新媒体运营的概念 1.新媒体 2.新媒体运营的五大方向 用户运营 产品运营 。。。 二、新媒体的岗位职责及要求 三、新媒体平台

快速开发与维护:探索 AndroidAnnotations

在移动应用开发的世界中&#xff0c;效率和可维护性是两个至关重要的要素。随着应用功能的不断增长和用户需求的不断变化&#xff0c;开发者们一直在寻找能够提高生产力的工具和框架。今天&#xff0c;我们将深入探讨一个能够帮助开发者实现快速开发和易于维护的框架——Androi…

npm run build报Cannot find module错误的解决方法

目录 一、问题描述二、解决方法一、问题描述 执行 npm run build 报 Cannot find module 错误: npm run build> vite-vue3@0.0.0 build > vite buildfailed to load config from D:\Workspaces\PhpProjects\jjj-edu-master\jjj_edu_admin\vite.config.js error during…

dgl库安装

此篇文章继续上一篇pytorch已经安装成功的情况 &#xff08;python3.9&#xff0c;pytorch2.2.2&#xff0c;cuda11.8&#xff09; 上一篇pytorch安装教学链接 选择与之匹配的版本 输入下方代码进行测试 import dgl.data dataset dgl.data.CoraGraphDataset() print(‘Numb…

使用宝塔部署项目在win上

项目部署 注意&#xff1a; 前后端部署项目&#xff0c;需要两个域名&#xff08;二级域名&#xff0c;就是主域名结尾的域名&#xff0c;需要在主域名下添加就可以了&#xff09;&#xff0c;前端一个&#xff0c;后端一个 思路&#xff1a;访问域名就会浏览器会加载前端的代…

【Redis入门到精通二】Redis核心数据类型(String,Hash)详解

目录 Redis数据类型 1.String类型 &#xff08;1&#xff09;常见命令 &#xff08;2&#xff09;内部编码 2.Hash类型 &#xff08;1&#xff09;常见命令 &#xff08;2&#xff09;内部编码 Redis数据类型 查阅Redis官方文档可知&#xff0c;Redis提供给用户的核心数据…

【HTML5】html5开篇基础(1)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

代码随想录冲冲冲 Day51 图论Part3

101. 孤岛的总面积 dfs 首先dfs的作用就是在遇到陆地的时候找到所有的周围陆地 对于这道题的dfs 会把所有的链接边缘的陆地变成海洋 这样在全部调整之后 剩下的就是孤岛了 这道题中的dfs的结束条件就是遇到海洋时 遇到每一个陆地就会把面积1&#xff0c;在每一次重新找到…

(Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)

接着上一篇文章来搞,批量查询点赞状态。这个接口提供给其他的微服务调用所以这里会用到FeignClient 直接上接口 1. 接口信息 这里是查询多个业务的点赞状态,因此请求参数自然是业务id的集合。由于是查询当前用戶的点赞状态,因此无需传递用戶信息。当前用户指的是登录用户 …

MATLAB绘图:5.三维图形

三维图形 基本的三维绘图包括&#xff1a; 线型&#xff08;Line&#xff09;网格型&#xff08;Mesh&#xff09;区域型&#xff08;Area&#xff09;面型&#xff08;Surface&#xff09;方向矢量型&#xff08;Direction&#xff09;容积型&#xff08;Volumetric&#xf…

ELF文件结构

ELF文件格式的最前部是 ELF文件头&#xff08;ELF Header&#xff09; &#xff0c;包含整个文件的基本属性。然后是各个节&#xff0c;ELF文件中与节有关的结构是 “节表&#xff08;Section Header Table&#xff09;”&#xff0c;节表描述ELF文件包含的所有节的信息。 文件…

layui时间选择器选择周 日月季度年

<!-- layui框架样式 --><link type"text/css" href"/static/plugins/layui/css/layui.css" rel"stylesheet" /><!-- layui框架js --><script type"text/javascript" src"/static/plugins/layui/layui.js&qu…

MYSQL面试知识点手册

第一部分&#xff1a;MySQL 基础知识 1.1 MySQL 简介 MySQL 是世界上最流行的开源关系型数据库管理系统之一&#xff0c;它以性能卓越、稳定可靠和易用性而闻名。MySQL 主要应用在 Web 开发、大型互联网公司、企业级应用等场景&#xff0c;且广泛用于构建高并发、高可用的数据…

Qt_多元素控件

目录 1、认识多元素控件 2、QListWidget 2.1 使用QListWidget 3、QTableWidget 3.1 使用QListWidget 4、QTreeWidget 4.1 使用QTreeWidget 5、QGroupBox 5.1 使用QGroupBox 6、QTabWidget 6.1 使用QTabWidget 结语 前言&#xff1a; 在Qt中&#xff0c;控件之间…

Windows上,使用远程桌面连接Ubuntu

要在 Ubuntu 上设置公网 IP 并通过 Windows 远程桌面连接到 Ubuntu&#xff0c;你需要完成以下步骤&#xff1a; 设置 Ubuntu 公网 IP&#xff1a; 确保你的 Ubuntu 服务器已经配置了一个公网 IP 地址。 你可以通过云服务提供商&#xff08;如 AWS、Azure、Google Cloud&#…