前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【2025-02-26】基础算法:二分查找(二)

【2025-02-26】基础算法:二分查找(二)

作者头像
用户11029137
发布于 2025-02-27 00:20:39
发布于 2025-02-27 00:20:39
11200
代码可运行
举报
文章被收录于专栏:编程学习编程学习
运行总次数:0
代码可运行

📝前言说明: ●本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,主要跟随B站博主灵茶山的视频进行学习,专栏中的每一篇文章对应B站博主灵茶山的一个视频 ●题目主要为B站视频内涉及的题目以及B站视频中提到的“课后作业”。 ●文章中的理解仅为个人理解。 ●文章中的截图来源于B站博主灵茶山,如有侵权请告知。

一,视频题目

1,162. 寻找峰值

●题目:

●题解:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 2
        while left <= right:
            mid = (left + right) // 2
            if nums[mid] > nums[mid + 1]: # 说明[0,mid] 必有一个峰值
                right = mid - 1 # 判断清楚收缩方向
            else: 
                left = mid + 1
        return right + 1

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def findMin(self, nums: List[int]) -> int:
        # 以数组最后一个数为基准,配合mid来判断最小值的位置
        # 1,如果nums[mid] > nums[-1]: 则最小值一定在mid的右侧(可证),向右收缩
        # 2,如果nums[mid] < nums[-1]: 则最小值一定在mid的左侧,向左收缩
        left, right = 0, len(nums) - 2
        while left <= right:
            mid = (left + right) // 2
            if nums[mid] > nums[-1]:
                left = mid + 1
            else:
                right = mid - 1
        return nums[left] # left 指向的是满足(nums[mid] > nums[-1])的右边一个,又因为最小值在右侧,所以left指向的就是最小值

3,33. 搜索旋转排序数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        def check(mid:int) -> bool:
            x = nums[mid]
            if x > nums[-1]: # 借助数组最后一个数字间接判断: x是否在target右边
                return target > nums[-1] and x >= target
            else:
                return target > nums[-1] or x >= target
        left, right =0, len(nums) - 1
        while left <= right:
            mid = (left + right) // 2
            if check(mid):
                right = mid - 1
            else:
                left = mid + 1
        return left if nums[left] == target else -1

二,课后作业

1,1901. 寻找峰值

暴力解法,若走到一个格子都与周围四个比较,然后选择最大的,最后一定能走到一个峰顶 基于上面的思路,考虑使用二分 先得到某一行的最大值,一该最大值为基础,和上下两行的相邻元素进行比较,分类讨论: 易证得:数值大的元素的那边区间一定会存在一个峰顶(具体分析如下)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def findPeakGrid(self, mat: List[List[int]]) -> List[int]:
        left, right = 0, len(mat) - 2
        while left <= right:
            mid = (left + right) // 2
            mx = max(mat[mid]) # 求出该行的最大值
            if mx > mat[mid+1][mat[mid].index(mx)]:
                right = mid - 1
            else:
                left = mid + 1 # left 循环不变量
        return [left, mat[left].index(max(mat[left]))]

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 2
        while left <= right:
            mid = (left + right) // 2
            if nums[mid] == nums[right+1]: # 和区间最后一个元素比较
                right -= 1
            elif nums[mid] < nums[right+1]:
                right = mid - 1
            else:
                left = mid + 1
        return nums[left]
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【2025-02-25】基础算法:二分查找(一)
📝前言说明: ●本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,主要跟随B站博主灵茶山的视频进行学习,专栏中的每一篇文章对应B站博主灵茶山的一个视频 ●题目主要为B站视频内涉及的题目以及B站视频中提到的“课后作业”。 ●文章中的理解仅为个人理解。 ●文章中的截图来源于B站博主灵茶山,如有侵权请告知。
用户11029137
2025/02/26
980
【2025-02-25】基础算法:二分查找(一)
【优选算法】专题三:二分查找(二)
xxxflower
2024/01/09
1050
【优选算法】专题三:二分查找(二)
【算法刷题指南】二分查找
南桥
2025/02/07
510
【算法专题】二分查找
题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 - 1。
YoungMLet
2024/03/01
1470
【算法专题】二分查找
LeetCode-算法-二分查找-第16天
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2] 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7] 注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。 给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。
布衣者
2021/09/07
2760
二分算法详解
这是一道单纯的朴素二分模版题,当 left == right 时的这种情况也是需要考虑的,因为不排除数组中只有一个数的情况,或者是二分到数组中只剩一个数的情况,所以循环条件要写 left <= right
2的n次方
2024/10/15
1000
二分算法详解
【2025-02-12】 基础算法:滑动窗口
📝前言说明: ●本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,主要跟随B站博主灵茶山的视频进行学习,专栏中的每一篇文章对应B站博主灵茶山的一个视频 ●题目主要为B站视频内涉及的题目以及B站视频中提到的“课后作业”。 ●文章中的理解仅为个人理解。 ●文章中的截图来源于B站博主灵茶山,如有侵权请告知。
用户11029137
2025/02/14
450
【2025-02-12】 基础算法:滑动窗口
算法思想总结:二分查找算法
思路:找第一个,用左区间端点查找(模版2),找最后一个,用右端点区间查找(模版3)
小陈在拼命
2024/03/16
1190
算法思想总结:二分查找算法
【优选算法】Binary-Blade:二分查找的算法刃(下)
本篇接上一篇二分查找,主要通过部分题目熟悉二分查找的进阶使用,重点强调二段性,找到两个区间不同的地方在哪,多画图划分界限
DARLING Zero two
2025/01/08
440
【优选算法】Binary-Blade:二分查找的算法刃(下)
【C++】二分查找算法专题
二分查找是一个具有模版的算法,但他同时也是最恶心的算法之一,关键在于要注意的细节多一点,稍有不慎就会发生死循环,模版分为普通版的,可以解决大部分的问题,进阶版的可以解决更加上档次的二分题。
啊QQQQQ
2024/11/19
880
【C++】二分查找算法专题
【刷题】 二分查找进阶
二分查找的算法思想是很好理解的。朴素二分很容易,但一般常使用左端点查找与右端点查找来解决问题。 模版:
叫我龙翔
2024/04/21
1040
【刷题】 二分查找进阶
初识算法 · 二分查找(4)
​本文的主题是二分查找,通过三道题目讲解,一道是寻找峰值,一道是搜索旋转排序数组的最小值,一道是0 - n-1中缺失的数字。 链接分别为: 162. 寻找峰值 - 力扣(LeetCode)
_lazy
2024/11/19
760
初识算法 · 二分查找(4)
深度解析算法之二分查找(2)
题目链接 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
凯子坚持C
2025/04/20
1090
深度解析算法之二分查找(2)
【二分算法】——8个题目让你找到二分算法的感觉势如破竹
https://leetcode.cn/problems/binary-search/
用户11286421
2024/10/12
4150
【二分算法】——8个题目让你找到二分算法的感觉势如破竹
【优先算法】专题——二分查找算法
二分查找的特点就是细节最多,最容易写出现死循环的算法,但是理解之后还是非常简单的。
用户11375356
2024/12/28
1220
【优先算法】专题——二分查找算法
【优选算法篇】剥洋葱式探索:用二分查找精准定位答案(下篇)
接上篇:【优选算法篇】寻找隐藏的宝藏:用二分查找打开算法世界的大门(上篇)-CSDN博客
熬夜学编程的小王
2024/12/24
600
【优选算法篇】剥洋葱式探索:用二分查找精准定位答案(下篇)
二分查找经典题目
只有left > right时才能跳出循环,因为每次分割出来的区间的数是未知的,当left == right的时候仍然要检查
用户11039529
2024/09/24
1350
二分查找的通用模板
二分查找适用于对于有序数组的精确查找,例如从一个有序数组中找到指定元素的索引,可将时间复杂度从普通枚举的 O(n) 降至 O(log n) ,前提是数组必须是有序的,否则是没有办法使用二分查找的。二分查找的思想虽然简单,不过在实现过程中会有很多细节问题需要注意,例如判断循环是用left < right还是用left <= right,right是取最右的元素还是取数组的边界。本文想通过七个例题,约定一种规则或是模板,从此让写二分查找不再出现模棱两可的局面。
兜兜转转
2023/03/08
9310
刷完这19道leetcode二分查找算法,不信进不了大厂
对于二分题,其实就是设定一个中间值 mid, 然后通过这个值进行一个判断 check(mid), 通过这个函数的返回值,判断将不可能的一半剪切掉;
hellocoder2028
2022/11/10
4840
LeetCode-二分查找
二分查找也称为折半查找,每次都能将查找区间减半,这种折半特性的算法时间复杂度为 O(logN)。
LittlePanger
2020/04/14
6210
相关推荐
【2025-02-25】基础算法:二分查找(一)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验