Leetcode刷题-二分查找

灵神的二分视频:二分查找 红蓝染色法_哔哩哔哩_bilibili

34

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        right = len(nums) - 1
        left = 0
        res = [-1,-1]
        mid = int((right + left)/2)
        while right >= left:
            if nums[mid] < target:
                left = mid + 1
                mid = int((right + left)/2)
                continue
            if nums[mid] > target:
                right = mid - 1
                mid = int((right + left)/2)
                continue
            if nums[mid] == target:
                res[0] = mid
                res[1] = mid
                break
        if res[0] != -1:
            right = mid + 1
            left = mid - 1
            while right >= 0 and right < len(nums):
                if nums[right] != target:
                    break
                res[1] = right
                right += 1
            while left >= 0:
                if nums[left] != target:
                    break
                res[0] = left
                left -= 1
        return res

        

35

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left = -1
        right = len(nums)
        while left + 1 < right:
            mid = (left + right) // 2
            if nums[mid] < target:
                left = mid
            else:
                right = mid
        return right
        

704

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left = -1
        right = len(nums)
        while left + 1 < right:
            mid = (left + right) // 2
            if nums[mid] < target:
                left = mid
            else:
                right = mid
        if right >= 0 and right < len(nums) and nums[right] == target:
            return right
        else:
            return -1        

744

class Solution:
    def nextGreatestLetter(self, letters: List[str], target: str) -> str:
        left = -1
        right = len(letters)
        while left + 1 < right:
            mid = (left + right) // 2
            if letters[mid] < chr(ord(target) + 1):
                left = mid
            else:
                right = mid
        if right >= 0 and right < len(letters):
            return letters[right]
        else:
            return letters[0]
        

2529

class Solution:
    def maximumCount(self, nums: List[int]) -> int:
        left = -1
        right = len(nums)
        pos = 0
        neg = 0
        while left + 1 < right:
            mid = (left + right) // 2
            if nums[mid] < 1:
                left = mid
            else:
                right = mid
        pos = len(nums) - right
        left = -1
        right = len(nums)
        while left + 1 < right:
            mid = (left + right) // 2
            if nums[mid] < 0:
                left = mid
            else:
                right = mid
        neg = right
        return max(pos,neg)

1385

class Solution:
    def findTheDistanceValue(self, arr1: List[int], arr2: List[int], d: int) -> int:
        arr2.sort()
        res = 0
        for taget in arr1:
            left = -1
            right = len(arr2)
            while left + 1 < right:
                mid = (left + right) // 2
                if arr2[mid] + d < taget:
                    left = mid
                else:
                    right = mid
            if right == len(arr2) or arr2[right] > taget + d:
                res += 1
        return res    
        

        

1385

     先将potions列表排序,保证它是一个单调列表。然后遍历每一个咒语,找到刚好满足success条件的位置,即求出当前咒语和药水的成功对数。

class Solution:
    def successfulPairs(self, spells: List[int], potions: List[int], success: int) -> List[int]:
        potions.sort()
        res = []
        for i in spells:
            left = -1
            right = len(potions)
            
            while left + 1 < right:
                mid = (left + right) // 2
                if i * potions[mid] < success:
                    left = mid
                else:
                    right = mid

            res.append(len(potions)-right)
            
        return res

        

2389

class Solution:
    def answerQueries(self, nums: List[int], queries: List[int]) -> List[int]:
        ans = []
        nums.sort()
        for j in range(1,len(nums)):
            nums[j] += nums[j-1]
        print(nums)
        for i in queries:
            left = -1
            right = len(nums)
            while left + 1 < right:
                mid = (left + right) // 2
                if nums[mid] < i + 1:
                    left = mid
                else:
                    right = mid
            ans.append(right)
        return ans

        

1170

使用二分查找找到刚好比queries中统计值大1的位置,再用words的长度减去即为答案。

class Solution:
    def numSmallerByFrequency(self, queries: List[str], words: List[str]) -> List[int]:
        q = []
        w = []
        for i in words:
            a = min(i)
            w.append(i.count(a,0,len(i)))
        for j in queries:
            b = min(j)
            q.append(j.count(b,0,len(j)))
        w.sort()
        res = []
        for k in q:
            left = -1
            right = len(w)
            while left + 1 < right:
                mid = (left + right) // 2
                if w[mid] < k + 1:
                    left = mid
                else:
                    right = mid
            res.append(len(w) - right)
        return res
        

        

2080

先记录每个数字出现的位置,再用二分查找找出满足的位置,先找左端,再找右端。

class RangeFreqQuery:

    def __init__(self, arr: List[int]):
        pos = defaultdict(list)
        for i, x in enumerate(arr):
            pos[x].append(i)
        self.pos = pos

    def query(self, left: int, right: int, value: int) -> int:
        a = self.pos[value]
        # a.sort()
        lf = -1
        lr = len(a)
        while lf + 1 < lr:
            mid = (lf + lr) // 2
            if a[mid] < left:
                lf = mid
            else:
                lr = mid
        res = 0
        res += lr
        lf = -1
        lr = len(a)
        while lf + 1 < lr:
            mid = (lf + lr) // 2
            if a[mid] < right + 1:
                lf = mid
            else:
                lr = mid
        res = lr - res
        return res

        


# Your RangeFreqQuery object will be instantiated and called as such:
# obj = RangeFreqQuery(arr)
# param_1 = obj.query(left,right,value)

2563

        排序,然后进行二分查找。排序后顺序可能会混乱,题目要求的是下标 i < j。但是经过分析,我们可以发现,如果使用暴力做法,那么nums[j] 再整个过程中,和除了他自己本身的数都进行了一次数对判断(即nums[j] + 任意非自己的数)。 假设数对(i,j),i < j 满足nums[i] + nums[j] >= lower && nums[i] + nums[j] <= upper,那么数对(j,i)也满足,所以在结果上这两个数组是等价的,但由于题目要求只要(i,j),所以取其中一半即可,也就是我们可以忽略对原数组排序后下标的改变,保证只计入(i,j)或者(j,i)其中一种到答案中即可。所以我们可以设置每一次二分查找的区间为[ 0 , j - 1] (我这里采用的是开区间写法,所以是 [ 0 , j ]),这样就可以保证只计入(i,j)或者(j,i)。

class Solution:
    def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:
        res = 0
        n = nums
        n.sort()
        for i in range(len(n)):
            x = n[i]
            left = -1
            right = i
            while left + 1 < right:
                mid = (left + right) // 2
                if n[mid] + x < lower:
                    left = mid
                else:
                    right = mid
            p1 = right
            left = -1
            right = i
            while left + 1 < right:
                mid = (left + right) // 2
                if n[mid] + x < upper + 1:
                    left = mid
                else:
                    right = mid
            res += (right - p1)
        return res



        

2856

class Solution:
    def minLengthAfterRemovals(self, nums: List[int]) -> int:
        x = nums[len(nums) // 2]
        left = -1
        right = len(nums)
        while left + 1 < right:
            mid = (left + right) // 2
            if nums[mid] < x:
                left = mid
            else:
                right = mid
        p1 = right

        left = -1
        right = len(nums)
        while left + 1 < right:
            mid = (left + right) // 2
            if nums[mid] < x + 1:
                left = mid
            else:
                right = mid
        res = right - p1

        return max(res * 2 - len(nums), len(nums) % 2)        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CPU狂飙900%如何分析?怎么定位?怎么溯源处理

当你的服务器CPU飙升到900%&#xff0c;系统卡顿、响应迟缓、业务受阻&#xff0c;这种令人焦虑的场景是否让你束手无策&#xff1f;别慌&#xff0c;这并不是世界末日&#xff0c;只要掌握正确的分析与定位方法&#xff0c;就能快速找到问题根源&#xff0c;并有效解决。 CPU…

leetcode919. 完全二叉树插入器,队列只保存右子树为空的节点

leetcode919. 完全二叉树插入器 完全二叉树 是每一层&#xff08;除最后一层外&#xff09;都是完全填充&#xff08;即&#xff0c;节点数达到最大&#xff09;的&#xff0c;并且所有的节点都尽可能地集中在左侧。 设计一种算法&#xff0c;将一个新节点插入到一棵完全二叉树…

Mysql安装,mysql-installer-community-8.0.41.0

“windowR"键弹出运行框&#xff0c;输入”cmd"进入window命令提示符&#xff0c;输入“mysql -uroot -p"按下回车&#xff0c;再输入密码&#xff0c;按下回车&#xff0c;出现下面界面则是配置成功。 默认会在 C:\Program Files\MySQL\MySQL Server 8.0\bin …

Linux内核编程(二十一)USB驱动开发-键盘驱动

一、驱动类型 USB 驱动开发主要分为两种&#xff1a;主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备&#xff0c;而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…

1.21学习记录

misc 2023isctf 你说爱我尊嘟假嘟 这题有点脑洞&#xff0c;需要把你说爱我换成Ook.将尊嘟换为Ook&#xff01;假嘟换成Ook&#xff1f;&#xff08;根据语气进行猜测吧&#xff09;用在线工具解密最后用base64解密即可 2023isctf 杰伦可是流量明星 解压后是一个MP3文件&am…

BaseCTF_Misc_week3

目录 broken.mp4 白丝上的flag 这是一个压缩包 纯鹿人 外星信号 我要吃火腿 Base Revenge broken.mp4 附件两个MP4文件&#xff0c;第一个可以播放&#xff0c;内容是视频受损的修复啥的。第二个破损了&#xff0c;那么就根据第一个视频的网页名称搜索找到相应的网页&…

Flutter项目和鸿蒙平台的通信

Flutter项目和鸿蒙平台的通信 前言Flutter和Harmonyos通信MethodChannelBasicMessageChannelEventChannel 前言 大家在使用Flutter开发项目的时候&#xff0c; Flutter提供了Platfrom Channel API来和个个平台进行交互。 Flutter官方目前提供了一下三种方式来和个个平台交互&…

@TransactionEventListener的关键源码整理

前言&#xff1a;本篇文章不属于保姆级的&#xff0c;主要是方便自己回忆用的&#xff0c;所以需要阅读者具有一定的Spring源码基础。 总结&#xff1a; TransactionEventListener本质上还是EventListener&#xff0c;事件的发布还是Spring通用的那一套事件发布机制。EventLis…

StarRocks强大的实时数据分析

代码仓库&#xff1a;https://github.com/StarRocks/starrocks?tabreadme-ov-file StarRocks | A High-Performance Analytical Database 快速开始&#xff1a;StarRocks | StarRocks StarRocks 是一款高性能分析型数据仓库&#xff0c;使用向量化、MPP 架构、CBO、智能物化…

SpringBoot实现定时任务,使用自带的定时任务以及调度框架quartz的配置使用

SpringBoot实现定时任务&#xff0c;使用自带的定时任务以及调度框架quartz的配置使用 文章目录 SpringBoot实现定时任务&#xff0c;使用自带的定时任务以及调度框架quartz的配置使用一. 使用SpringBoot自带的定时任务&#xff08;适用于小型应用&#xff09;二. 使用调度框架…

蓝桥与力扣刷题(73 矩阵置零)

题目&#xff1a;给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&…

源码分析之Openlayers中样式篇Text类

访问Openlayers网站(https://jinuss.github.io/Openlayers_map_pages/&#xff0c;网站是基于Vue3 Openlayers&#xff0c;里面有大量的实践和案例。觉得还不错&#xff0c;可以 给个小星星Star&#xff0c;鼓励一波 https://github.com/Jinuss/OpenlayersMap哦~ 概述 Text 类…

uniapp开发 swiper 上下滚动

一、效果图 二、代码: 在uni-app中使用swiper组件实现上下滚动(垂直滚动)的功能可以通过设置vertical属性来实现。swiper组件默认是水平滚动的,通过将vertical属性设置为true,可以改变滚动方向为垂直。 <template><view><swiper

OSI5GWIFI自组网协议层次对比

目录 5G网络5G与其他协议栈各层映射 5G网络 物理层 (PHY) 是 5G 基站协议架构的最底层&#xff0c;负责将数字数据转换为适合无线传输的信号&#xff0c;并将接收到的无线信号转换为数字数据。实现数据的编码、调制、多天线处理、资源映射等操作。涉及使用新的频段&#xff08…

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮&#xff0c;但是2025年更新之后这个按钮就不提供了&#xff0c;所以需要使用新的方式下载 ps:给自己的网站推广下~~&#xff08;国内直连GPT/Claude&#xff09; 新的下载方式1 首先打开vscode商店官网&#xff1a;vscode插件下载…

Maven多环境打包方法配置

简单记录一下SpringBoot多环境打包配置方法&#xff0c;分部署环境和是否包含lib依赖包两个维度 目录 一、需求说明二、目录结构三、配置方案四、验证示例 一、需求说明 基于Spring Boot框架的项目分开发&#xff0c;测试&#xff0c;生产等编译部署环境&#xff08;每一个环境…

异或和之和

题目&#xff1a; 0异或和之和 - 蓝桥云课 异或和之和 题目描述 给定一个数组 Ai​&#xff0c;分别求其每个子段的异或和&#xff0c;并求出它们的和。或者说&#xff0c;对于每组满足 1≤L≤R≤n 的 L,R&#xff0c;求出数组中第 L 至第 R 个元素的异或和。然后输出每组 …

[OpenGL]实现屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)

一、简介 本文介绍了 屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO) 的基本概念&#xff0c;实现流程和简单的代码实现。实现 SSAO 时使用到了 OpenGL 中的延迟着色 &#xff08;Deferred shading&#xff09;技术。 按照本文代码实现后&#xff0c;可以实现以下…

c++ 与 Matlab 程序的数据比对

文章目录 背景环境数据保存数据加载 背景 ***避免数据精度误差&#xff0c;快速对比变量 *** 环境 c下载 https://github.com/BlueBrain/HighFive 以及hdf5库 在vs 中配置库 数据保存 #include <highfive/highfive.hpp> using namespace HighFive;std::string fil…

Java基础——概念和常识(语言特点、JVM、JDK、JRE、AOT/JIT等介绍)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…