首页 > 其他分享 >【模板题】二分法 - 34. 在排序数组中查找元素的第一个和最后一个位置

【模板题】二分法 - 34. 在排序数组中查找元素的第一个和最后一个位置

时间:2024-09-09 19:48:36浏览次数:11  
标签:right return target nums mid 34 二分法 模板 left

题目链接 34. 在排序数组中查找元素的第一个和最后一个位置
思路 二分法
题解链接 【视频讲解】二分查找总是写不对?三种写法,一个视频讲透!(Python/Java/C++/C/Go/JS)
关键点 模板题;应当熟练掌握
时间复杂度 \(O(\log n)\)
空间复杂度 \(O(1)\)

代码实现:

# 闭区间
def lower_bound(nums, target):
    left, right = 0, len(nums) - 1
    while left <= right:
        # 循环不变量:
        # nums[left-1] < target
        # nums[right+1] >= target
        mid = (left + right) // 2
        if nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return left

# 左闭右开区间
def lower_bound2(nums, target):
    left, right = 0, len(nums)
    while left < right:
        mid = (left + right) // 2
        # 循环不变量:
        # nums[left] < target
        # nums[right] >= target
        if nums[mid] < target:
            left = mid + 1
        else:
            right = mid
    return left


# 开区间
def lower_bound3(nums, target):
    left, right = -1, len(nums)
    while left + 1 < right:
        mid = (left + right) // 2
        # 循环不变量:
        # nums[left] < target
        # nums[right] >= target
        if nums[mid] < target:
            left = mid
        else:
            right = mid
    return right


class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        start = lower_bound(nums, target)
        if start == len(nums) or nums[start] != target:
            return [-1, -1]
        end = lower_bound3(nums, target+1) - 1
        return [start, end]

标签:right,return,target,nums,mid,34,二分法,模板,left
From: https://www.cnblogs.com/WrRan/p/18405163

相关文章

  • P4734 [BalticOI 2015] Hacker
    题目大意详细题目传送门思路对于这种题目一般可以先断环成链。发现先手所得到的值是一个长度为\(\lceil\frac{n}{2}\rceil\)的区间,我们希望让它的元素之和能取到最大,但发现后手会让我们取不到最大。假设我们从第\(i\)台电脑开始,那么后手一定会让我们取到一个所有经过这......
  • Binary Search 二分查找算法:逻辑的舞蹈,二分法的精准步伐
    BinarySearch二分查找算法:逻辑的舞蹈,二分法的精准步伐二分查找算法,也称为二分搜索算法(BinarySearch),是一种在有序数组中查找特定元素的高效算法。它通过反复将搜索区间减半来快速定位目标值。二分查找算法的效率远高于线性搜索,因为它每次比较都能排除掉一半的搜索空间。......
  • 洛谷题单指南-常见优化技巧-P1886 滑动窗口 /【模板】单调队列
    原题链接:https://www.luogu.com.cn/problem/P1886题意解读:单调队列模版题。解题思路:采用双端队列维护单调的序列,单调队列三部曲:1、去头,当窗口内元素个数超过k,队头出队2、去尾,当要加入的元素会破坏单调性,队尾出队3、入队,将元素的下标存入队列每一次入队后,队头元素即为窗口最......
  • C++学习笔记(曾经我看不懂的代码2:基于范围的for循环、auto使用、stl容器、template模
    不知不觉c++程序设计:标准库已经看了一大半了,学到了很多,很多曾经在网上和在书上看到却看不懂的代码,在看完标准库中的大半内容以后,都能大致的理清代码的含义。代码模板一:for(auto&a:arr)1、基于范围的for循环:a为迭代变量,arr为迭代范围,&表示引用。写一个例子:#include<ios......
  • C++ 模板进阶知识——stdenable_if
    目录C++模板进阶知识——std::enable_if1.简介和背景基本语法使用场景2.`std::enable_if`的基本用法示例:限制函数模板只接受整数类型3.SFINAE和std::enable_if示例:使用SFINAE进行函数重载SFINAE的优点应用场景4.在类模板中使用std::enable_if示例:根据类型......
  • CRUD最佳实践PasteForm及项目模板的制作视频,让重复的CRUD更加简单直接[附带源码和视频
    关说不练假把式,在上一,二篇中介绍了我心目中的CRUD的样子基于之前的理念,我开发了一个命名为PasteTemplate的项目,这个项目呢后续会转化成项目模板,转化成项目模板后,后续需要开发新的项目就可以基于这个模板创建,这样就不要copy一个旧的项目,然后删删删,改改改,重命名等操作了强迫症,一......
  • 【生日视频制作】集装箱红色货车大卡车身AE模板AE模板修改文字软件生成器教程特效素材
    生日视频制作教程集装箱红色货车大卡车身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程怎么如何做的【生日视频制作】集装箱红色货车大卡车身AE模板AE模板修改文字软件生成器教程特效素材【AE模板】生日视频制作步骤:下载AE模板安装AE软件把AE模板导入AE......
  • 【SQL数据库技术开发】第34课时-数据库SQL CHECK 约束
    SQL CHECK 约束SQLCHECK约束CHECK约束用于限制列中的值的范围。如果对单个列定义CHECK约束,那么该列只允许特定的值。如果对一个表定义CHECK约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。CREATETABLE时的SQLCHECK约束下面的SQL在"Per......
  • UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334)
    A-ChristmasPresent题目大意给定两个正整数\(B,G\)(\(1\leB,G\le1000\)且\(B\neG\)),判断哪个更大。分析模拟即可。代码#include<cstdio>usingnamespacestd;intmain(){ intb,g; scanf("%d%d",&b,&g); puts(b>g?"Bat":&qu......
  • 代码随想录算法训练营,9月7日 | 150. 逆波兰表达式求值,239. 滑动窗口最大值,347.前 K 个
    150.逆波兰表达式求值题目链接:150.逆波兰表达式求值文档讲解︰代码随想录(programmercarl.com)视频讲解︰逆波兰表达式求值日期:2024-09-07想法:用栈解决,遇到运算符取前两个数字计算(表达式总是成立的,不用做额外的判定)Java代码如下:classSolution{publicintevalRPN(Stri......