Leedcode 二分查找每日两练 Python

简介: Leedcode 二分查找每日两练 Python

大一在读 大数据管理与应用专业 欢迎交流

备战蓝桥杯 倒计时72天

目前主要学习Python算法与数据结构 今日主题:二分查找  


image.png在这套流程里 l+1最终等于r 避免以往很多临界左移右移加一减一的讨论情况 并且mid(图片里的m)的范围处在[1,n-1] 真的很棒!

例一:nums为无重复的升序序列

image.png

问题分析 :划分红蓝区域  红区<=target 蓝区>target

若红区最后一个元素等于 target 返回下标 否则返回下标+1


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


image.png

例二:nums是一个非递减数组(前一篇博客出了下面这道的index解法[不建议使用]没有思考尽管 通过效率很高但还是不建议用这种手段做题)


image.png


问题分析:1:找到第一个等于target的数字 划分红蓝区域

红区小于target 蓝区>=target 如果蓝区的第一个元素不等于target(前提是该元素下标可访问) 说明不存在 直接返回[-1,-1]

如果蓝区的第一个元素下标不可访问等价于 l+1>len(nums)-1 返回[-1,-1]

否则返回蓝区的第一个下标X1

2:找到最后一个等于target的数字 划分红蓝区域

红区小于等于target 蓝区大于target

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        l,r=-1,len(nums)
        while l+1<r:
            mid=(l+r)//2
            if nums[mid]>=target:
                r=mid
            else:
                l=mid#红区记录<target
        if l==len(nums)-1:return [-1,-1]#如果不成立 l+1就是其中一个答案
        if nums[l+1]!=target:return [-1,-1]
        l1,r1=l,len(nums)
        while l1+1<r1:
            mid=(l1+r1)//2
            if nums[mid]>target:
                r1=mid
            else:
                l1=mid#红区记录<=target
        return [l+1,l1]


image.png

我是小郑 期待与你一起奔赴山海!蓝桥杯加油!


目录
相关文章
|
3月前
|
Python
【Leetcode刷题Python】5. 最长回文子串
LeetCode 5题 "最长回文子串" 的Python解决方案,使用动态规划算法找出给定字符串中的最长回文子串。
43 3
|
3月前
|
Python
【Leetcode刷题Python】53. 最大子数组和
LeetCode第53题"最大子数组和"的Python解决方案,利用动态规划的思想,通过一次遍历数组并维护当前最大和以及全局最大和来求解。
87 2
|
3月前
|
存储 Python
【Leetcode刷题Python】64. 最小路径和
一种使用动态规划解决LeetCode上64题“最小路径和”的Python实现方法,通过维护一个一维数组来计算从网格左上角到右下角的最小路径总和。
32 1
【Leetcode刷题Python】64. 最小路径和
|
3月前
|
Python
【Leetcode刷题Python】16. 最接近的三数之和
解决LeetCode "最接近的三数之和" 问题的Python实现,通过排序和双指针法,记录并更新与目标值最接近的三数之和。
33 1
|
3月前
|
Python
【Leetcode刷题Python】704. 二分查找
解决LeetCode "二分查找" 问题的Python实现代码。
18 0
|
3月前
|
Python
【Leetcode刷题Python】343. 整数拆分
LeetCode 343题 "整数拆分" 的Python解决方案,使用动态规划算法来最大化正整数拆分为多个正整数之和的乘积。
26 0
|
3月前
|
Python
【Leetcode刷题Python】15. 三数之和
LeetCode "三数之和" 问题的Python实现代码,通过排序、双指针和跳过重复元素的方法找出所有和为0的不重复三元组。
18 0
|
3月前
|
Python
【Leetcode刷题Python】46. 全排列
本文介绍了LeetCode题目46的Python编程解决方案,题目要求给定一个不含重复数字的数组,返回该数组所有可能的全排列。
23 0
|
5月前
|
存储 SQL 算法
LeetCode第53题:最大子数组和【python 5种算法】
LeetCode第53题:最大子数组和【python 5种算法】
|
5月前
|
SQL 算法 数据挖掘
LeetCode第十五题:三数之和【15/1000 python】
LeetCode第十五题:三数之和【15/1000 python】