【Leetcode】二分查找合集

news2024/12/21 22:31:57

二分查找合集

二分模板

在这里插入图片描述

leetcode 704.二分查找

题目

在这里插入图片描述

思路

  1. 最简单的二分查找,直接套模板即可

代码

class Solution {
    public int search(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 if(nums[mid] < target){
                left = mid + 1;
            }else{
                return mid;
            }            
        }
        return -1;
    }
}

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

题目

在这里插入图片描述

思路

  1. 通过二分查找的方式,找到这段区间的左边界和右边界即可

代码

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        int[] ret = {-1,-1};
        if(nums.length == 0){
            return ret;
        }

        //查找左边界
        while(left < right){
            int mid = left + (right - left) / 2;
            if(nums[mid] < target){
                left = mid + 1;
            }else{
                right = mid;
            }
        }
        if(nums[left] != target){
            return ret;
        }
        ret[0] = left;
        left = 0;
        right = nums.length - 1;
        //查找右边界
        while(left < right){
            int mid = left + (right - left + 1) / 2;
            if(nums[mid] <= target){
                left = mid;
            }else{
                right = mid - 1;
            }
        }
        ret[1] = right;
        return ret;
    }
}

35. 搜索插入位置

题目

在这里插入图片描述

思路

  1. 题目要求使用logn 的时间复杂度,即明确表示使用二分查找来解决
  2. 根据插入元素的位置index,将数组分为两段,[left,index - 1]都是<target,[index,right]都是>=target,我们只要找到第二个区间的左边界,即可找到插入位置,即使用找数组左区间的模板即可

代码

class Solution {
    public int searchInsert(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;
            }
        }
        if(nums[right] < target){
            return right + 1;
        }
        return left;
    }
}

69.X的平方根

题目

在这里插入图片描述

思路

  1. 假设最终平方根的整数位为index ,则假设一个数组[1,x],其中都是整数,则可以分为两段,[1,index],这一段平方后都<=x,[index+1,right]这一段平方后都>x,这样分为两段,即可使用二分查找的方式,我们只需要找到第一段区间的右端点,即可求出index,此时套模板即可

代码

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

852. 山脉数组的峰顶索引

题目

在这里插入图片描述

  1. 根据题意,我们可以将这个数组分为两段,一段升序一段降序,我们既可以根据这个条件,使用二分查找来解题
  2. 假设封顶索引为index,此时将数组分为[left,index - 1]和[index, right]两段,左半段arr[i+1] > arr[i],右半段arr[i+1] < arr[i], 此时我们只需要求出右区间的左端点即可得出index,套用模板即可
  3. 根据此题我们可以知道,二分查找不一定需要数组有序,而是可以根据已知条件,将数组划分为两段即可

代码

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

162.寻找峰值

题目

在这里插入图片描述

思路

  1. 对于数组中的某个位置 mid,如果 nums[mid] > nums[mid+1],则说明峰值在 mid 的左侧(包括 mid 本身),如果 nums[mid] <= nums[mid+1],则说明峰值在 mid+1 的右侧。基于这个思路,我们可以使用二分查找来找到峰值。

代码

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

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

题目

在这里插入图片描述

思路

  1. 题目告诉使用logn的时间复杂度解决问题,即使用二分查找的方式解决问题
  2. 二分的基本思路就是将数组分为两段,假设最小元素下标为index,则可以分为[left,index - 1],[index,right],第一段元素都大于等于right,第二段元素都小于right,根据这个特性就可以把数组分为两段,我们要找的元素就是第二段的左区间,套用模板即可

代码

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

LCR 173.点名

题目

在这里插入图片描述

思路

  1. 升序数组查找元素优先考虑二分查找,
  2. 先考虑数组能否分为两段,观察得知假设我们要找的元素下表为index,则可以分为[left,index-1],[index,right],两段,其中第一段中数组在该下标中的值等于下标,而第二段则大于下标,此时我们转化为求第二段区间的左边界问题

代码

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

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

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

相关文章

CUDA C编程权威指南:1-基于CUDA的异构并行计算

什么是CUDA&#xff1f;CUDA&#xff08;Compute Unified Device Architecture,统一计算设备架构&#xff09;是NVIDIA&#xff08;英伟达&#xff09;提出的并行计算架构&#xff0c;结合了CPU和GPU的优点&#xff0c;主要用来处理密集型及并行计算。什么是异构计算&#xff1…

基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度(matlab代码)

目录 1 主要内容 系统结构图 P2G-CCS 耦合模型 其他算例对比 2 部分代码 3 下载链接 1 主要内容 该程序复现《基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度》模型&#xff0c;以碳交易和碳封存成本、燃煤机组启停和煤耗成本、弃风成本、购气成本之和为目标…

嵌入式系统中C++内存管理基本方法

引言 说到 C 的内存管理&#xff0c;我们可能会想到栈空间的本地变量、堆上通过 new 动态分配的变量以及全局命名空间的变量等&#xff0c;这些变量的分配位置都是由系统来控制管理的&#xff0c;而调用者只需要考虑变量的生命周期相关内容即可&#xff0c;而无需关心变量的具…

如何在 Windows 上安装 ONLYOFFICE 协作空间社区版

ONLYOFFICE 协作空间是一个在线协作平台&#xff0c;帮助您更好地与客户、业务合作伙伴、承包商及第三方进行文档协作。今天我们来介绍一下&#xff0c;如何在 Windows 上安装协作空间的自托管版。 ONLYOFFICE 协作空间主要功能 使用 ONLYOFFICE 协作空间&#xff0c;您可以&a…

【彩色图像处理GUI】各种颜色映射、重新调整大小和更改分辨率、伽玛校正,对比度,反转颜色(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【洛谷 P1216】[USACO1.5] [IOI1994]数字三角形 Number Triangles 题解(动态规划)

[USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中&#xff0c;从 7 → 3 → 8 →…

Linux系统编程系列之POSIX信号量

一、什么是POSIX信号量 POSIX信号量是一种用于线程之间同步和互斥的机制&#xff0c;它是由POSIX标准定义的一种IPC&#xff08;进程间通信&#xff09;机制&#xff0c;可以用于进程间或线程间的同步操作。POSIX信号量分成两种&#xff0c;POSIX匿名信号量和POSIX具体信号量。…

S-Clustr(影子集群)可控制嵌入式设备和个人电脑的僵尸网络工具

公告 项目地址:https://github.com/MartinxMax/S-Clustr/tree/V1.0.0 1.成功扩展3类嵌入式设备,组建庞大的"僵尸网络" |——C51[开发中] |——Arduino |——合宙AIR780e[开发中] 2.攻击者端与服务端之间通讯过程全程加密,防溯源分析 3.Generate一键自动生成Arduino…

deterministic=True requires SQLite 3.8.3 or higher

文章目录 出错来源解决方法 出错来源 在我的centos服务器执行Django网站 python manage.py runserver报错&#xff1a; deterministicTrue requires SQLite 3.8.3 or higher解决方法 pip3 install pysqlite3 pip3 install pysqlite3-binary找到下载的模块路径&#xff0c;修…

十天学完基础数据结构-第二天(数据结构简介)

什么是数据结构&#xff1f; 在计算机科学中&#xff0c;数据结构是一种组织和存储数据的方式。它定义了数据的布局&#xff0c;以及对这些数据执行的操作。你可以把数据结构看作是计算机内存中的特定组织方式&#xff0c;就像图书馆中书籍的排列一样。 数据结构可以是各种形…

STM32复习笔记(一):软件配置工程创建

目录 Preface&#xff1a; Hardware-Configuration & Software-Environment&#xff1a; &#xff08;一&#xff09;新建项目工程 &#xff08;二&#xff09;工程配置 &#xff08;三&#xff09;配置外设 &#xff08;四&#xff09;项目管理 &#xff08;五&…

qml保姆级教程二:qml基本数据类型

&#x1f482; 个人主页:pp不会算法v &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 QML系列教程 QML教程一&#xff1a;布局组件 文章目录 boolrealdouble…

Jmeter如何做压力测试

1.哪些业务需要做压力测试&#xff1f; 比较常用的业务场景或功能模块 单业务场景或多业务场景 项目要求做的业务场景 2.压力测试的并发数是多少&#xff1f; 有预期的数值&#xff1f;100 200 300一次性达到还是逐次增加&#xff1f;参照上次性能测试的结果 3.关注哪些参…

【代码随想录】LC 704. 二分查找

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 三、知识风暴 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记&#xff0c;如有侵权&#xff0c;立即删除。 一、题目 1、原题链接 704. 二分查找 2、题目描述 二…

cmake安装

Windows下安装Cmake教程 注意下载二进制版本的&#xff1a;

将3D MAX设计模型导入NX1988

将3D MAX设计模型导入NX1988 概述导入流程导出喜欢的模型对模型进行修改模型贴图 概述 一般家装设计都不会用NX之类的产品设计软件&#xff0c;也没有通用的文件格式可以互相转换&#xff0c;本文的目的是将从网上下载的一些设计较好的3D MAX模型导入到NX软件中借用&#xff0…

【11】c++设计模式——>单例模式

单例模式是什么 在一个项目中&#xff0c;全局范围内&#xff0c;某个类的实例有且仅有一个&#xff08;只能new一次&#xff09;&#xff0c;通过这个唯一的实例向其他模块提供数据的全局访问&#xff0c;这种模式就叫单例模式。单例模式的典型应用就是任务队列。 为什么要使…

Java新特性中的Preview功能如何运行和调试

在每个Java新版本发布的特性中&#xff0c;都会包含一些Preview&#xff08;预览&#xff09;功能&#xff0c;这些功能主要用来给开发者体验并收集建议。所以&#xff0c;Preview阶段的功能并不是默认开启的。 如果想体验某个Java版本中的Preview功能&#xff0c;您还需要做一…

C# 集合

C# 集合 集合集合接口和类型列表队列栈链表有序表字典LoopupHashSet位数组 集合 数组的大小是固定的。如果元素个数是动态的&#xff0c;就应使用集合类。List 和 ArrayList 是与数组相当的集合类。还有其他类型的集合&#xff1a;队列、栈、链表和字典。 集合接口和类型 集…

FL Studio21.1.0水果中文官方网站

FL Studio 21.1.0官方中文版重磅发布纯正简体中文支持&#xff0c;更快捷的音频剪辑及素材管理器&#xff0c;多样主题随心换&#xff01;Mac版新增对苹果M2/1家族芯片原生支持。DAW界萌神&#xff01;极富二次元造型的水果娘FL chan通过FL插件Fruity Dance登场&#xff0c;为其…