二分查找 红蓝染色法 【基础算法精讲 04】

news2024/11/19 7:47:52

视频链接 : 

二分查找 红蓝染色法_哔哩哔哩_bilibili

 在排序数组中查找元素的第一个和最后一个位置

链接 : 

在排序数组中查找元素的第一个和最后一个位置

思想 : 

暴力 :

在lc上,直接暴力枚举左端点和右端点也是能够通过的!

二分 : 

题目要求在O(log n)的时间复杂度处理该问题,那么就要用到二分的思想了!

设l,r为要找的区间的左右端点

代码 : 

1.暴力 (c++)

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
     int n=nums.size();
      int ans1=-1,ans2=-1;
      int num=0;
     if(n==0)
          {
              ans1=-1;
              ans2=-1;
          }
    if(n==1){
              if(nums[0]==target)
              {
                  ans1=0;
                  ans2=0;
              }
             else{
                     ans1=-1;
                     ans2=-1;
                 }  
          }
    if(n>=2)
      {
          for(int i=0;i<n;i++)
          {
              if(nums[i]==target)
                num++;
          }
          if(num==0)
            {
                ans1=-1;
                ans2=-1;
            }
          if(num==1)
          {
              for(int i=0;i<n;i++){
                  if(nums[i]==target)
                  {
                      ans1=i;
                      ans2=i;
                  }
              }
          }
          if(num>=2)
          {
              for(int i=0;i<n;i++)
              {
                  if(nums[i]==target)
                  {
                      ans1=i;
                      break;
                  }
              }
              for(int j=n-1;j>=0;j--)
              {
                  if(nums[j]==target)
                  {
                      ans2=j;
                      break;
                  }
              }
          }
      }
      return {ans1,ans2};
    }
};

2.二分(python)

# lower_bound 返回最小的满足 nums[i] >= target 的 i
# 如果数组为空,或者所有数都 < target,则返回 len(nums)
# 要求 nums 是非递减的,即 nums[i] <= nums[i + 1]

# 闭区间写法
def lower_bound(nums: List[int], target: int) -> int:
    left, right = 0, len(nums) - 1  # 闭区间 [left, right]
    while left <= right:  # 区间不为空
        # 循环不变量:
        # nums[left-1] < target
        # nums[right+1] >= target
        mid = (left + right) // 2
        if nums[mid] < target:
            left = mid + 1  # 范围缩小到 [mid+1, right]
        else:
            right = mid - 1  # 范围缩小到 [left, mid-1]
    return left  # 或者 right+1

# 左闭右开区间写法
def lower_bound2(nums: List[int], target: int) -> int:
    left = 0
    right = len(nums)  # 左闭右开区间 [left, right)
    while left < right:  # 区间不为空
        # 循环不变量:
        # nums[left-1] < target
        # nums[right] >= target
        mid = (left + right) // 2
        if nums[mid] < target:
            left = mid + 1  # 范围缩小到 [mid+1, right)
        else:
            right = mid  # 范围缩小到 [left, mid)
    return left  # 或者 right

# 开区间写法
def lower_bound3(nums: List[int], target: int) -> int:
    left, right = -1, len(nums)  # 开区间 (left, right)
    while left + 1 < right:  # 区间不为空
        mid = (left + right) // 2
        # 循环不变量:
        # nums[left] < target
        # nums[right] >= target
        if nums[mid] < target:
            left = mid  # 范围缩小到 (mid, right)
        else:
            right = mid  # 范围缩小到 (left, mid)
    return right  # 或者 left+1

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]
        # 如果 start 存在,那么 end 必定存在
        end = lower_bound(nums, target + 1) - 1
        return [start, end]

3.二分(c++)

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int leftBorder = getLeftBorder(nums, target);
        int rightBorder = getRightBorder(nums, target);
        // 情况一
        if (leftBorder == -2 || rightBorder == -2) return {-1, -1};
        // 情况三
        if (rightBorder - leftBorder > 1) return {leftBorder + 1, rightBorder - 1};
        // 情况二
        return {-1, -1};
    }
private:
     int getRightBorder(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        int rightBorder = -2; // 记录一下rightBorder没有被赋值的情况
        while (left <= right) {
            int middle = left + ((right - left) / 2);
            if (nums[middle] > target) {
                right = middle - 1;
            } else { // 寻找右边界,nums[middle] == target的时候更新left
                left = middle + 1;
                rightBorder = left;
            }
        }
        return rightBorder;
    }
    int getLeftBorder(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        int leftBorder = -2; // 记录一下leftBorder没有被赋值的情况
        while (left <= right) {
            int middle = left + ((right - left) / 2);
            if (nums[middle] >= target) { // 寻找左边界,nums[middle] == target的时候更新right
                right = middle - 1;
                leftBorder = right;
            } else {
                left = middle + 1;
            }
        }
        return leftBorder;
    }
};

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

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

相关文章

ToBeWritten之威胁狩猎环境应用

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

放弃36年的鞋服业务转而“卖粮”,贵人鸟胜算几何?

正处“中年”的运动鞋服老品牌贵人鸟&#xff0c;却开始了一场大转型。 近日&#xff0c;贵人鸟发布了优化调整公司经营业务的公告。公告提到&#xff0c;公司将逐步退出运动鞋服业务&#xff0c;聚焦粮食贸易。 回顾来看&#xff0c;贵人鸟曾在运动鞋服领域颇受市场认可。据了…

千兆光模块和万兆光模块已经过时了吗?

千兆和万兆光模块在过去很长一段时间里是网络交换机和路由器的核心所在&#xff0c;它们基于光纤传输技术&#xff0c;具有高速、稳定、效率高的特点。随着数字时代的来临&#xff0c;网络端也催生了更大带宽需求&#xff0c;这无疑对光模块的性能提出了更高的要求。我们不得不…

vue3富文本编辑器的二次封装开发-Tinymce

欢迎点击领取 -《前端面试题进阶指南》&#xff1a;前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的&#x1fa9c; 简介 1、安装&#xff1a;pnpm add tinymce / pnpm add tinymce/tinymce-vue > Vue3 tinymce tinymce/tinymce-vue 2、功能实现图片上传…

分布式锁:5种方案解决商品超卖的方案

一 分布式锁 1.1 分布式锁的作用 在多线程高并发场景下&#xff0c;为了保证资源的线程安全问题&#xff0c;jdk为我们提供了synchronized关键字和ReentrantLock可重入锁&#xff0c;但是它们只能保证一个工程内的线程安全。在分布式集群、微服务、云原生横行的当下&#xff…

w10系统 如何使用 C++、cmake、opencv、

w10系统的C环境配置 1.安装 vscode编辑器 首先安装&#xff1a;VScode 安装后开始安装插件&#xff1a; C 插件 2.配置w10系统的C环境 使用编译器MinGW 官方地址&#xff1a;https://www.mingw-w64.org/ 下载地址&#xff1a;https://sourceforge.net/projects/mingw-w64/f…

AI产品经理-能力模型

一、概况 AI产品经理/助理&#xff08;需求工程师&#xff09;&#xff1a;大多数入门的AI产品经理应该都在这里&#xff0c;顾名思义&#xff0c;就是在整体产品规划中帮助大PD实现部分产品功能的助理或者需求工程师&#xff0c;需要具备比较强的AI知识框架与理解能力以保障各…

Openlayers 教程 - 地图以及图层数据导出(打印)图片

Openlayers 教程 - 地图以及图层数据导出&#xff08;打印&#xff09;图片 地图导出核心代码完整代码&#xff1a;在线示例 本文包括地图导出核心代码、完整代码以及在线示例。 地图导出核心代码 这里放上 ES 封装的核心代码&#xff0c;创建多边形或者其他几何对象&#xff…

做小说推文和短剧推广,找数据好的授权平台

小说推文和短剧推广很多平台吃单怎么办&#xff1f;可以试试”巨量推文“&#xff0c;一个不吃单的平台 众所周知 小说推文和短剧推广很多平台会吃单&#xff0c;比如你实际官方数据是10个订单&#xff0c;很多平台只给你5个&#xff0c;这样你损失可能就是一半的利润&#xf…

【MySQL】基本查询(二)

文章目录 一. 结果排序二. 筛选分页结果三. Update四. Delete五. 截断表六. 插入查询结果结束语 操作如下表 //创建表结构 mysql> create table exam_result(-> id int unsigned primary key auto_increment,-> name varchar(20) not null comment 同学姓名,-> chi…

虚拟展厅有什么重要意义,了解虚拟展厅在宣传中的应用

引言&#xff1a; 随着科技的不断进步&#xff0c;虚拟展厅已经逐渐成为展览行业的重要一环。虚拟展厅是一种数字化平台&#xff0c;为观众提供了与传统展览完全不同的体验。 一&#xff0e;虚拟展厅的定义 虚拟展厅是一个通过互联网和虚拟现实技术创建的数字展示空间&#x…

windows系统下利用python对指定文件夹下面的所有文件的创建时间进行修改

windows系统下利用python对指定文件夹下面的所有文件的创建时间进行修改 不知道其他的朋友们有没有这个需求哈&#xff0c;反正咱家是有这个需求 需求1、当前有大量的文件需要更改文件生成的时间&#xff0c;因为不可告知的原因&#xff0c;当前的文件创建时间是不能满足使用的…

现在玩51单片机,这也太LOW了?

作为一名科普的博主&#xff0c;今天我们来聊一聊51单片机。 一、什么是51单片机 单片机是一种微型计算机&#xff0c;广泛应用于各种电子产品和工业控制领域。51单片机是指基于Intel的8051微处理器为核心的单片机&#xff0c;是最为常见和广泛应用的单片机之一。 二、51单片机…

近视眼选择什么台灯好?分享医生都说好的台灯

如今全国近视人数已经超过6亿&#xff0c;差不多占据了我国人口的一半&#xff0c;而青少年的近视率更是位居世界第一&#xff01;据数据显示&#xff0c;全国儿童青少年总体近视率高达53.6%&#xff0c;其中小学生为36.0%&#xff0c;初中生为71.6%&#xff0c;高中生为81.0%&…

微服务学习(十一):安装Git

微服务学习&#xff08;十一&#xff09;&#xff1a;安装Git 1、下载Git 官网下载Git 2、将下载后的资源包上传到服务器 3、解压并安装 tar -zxvf git-2.42.0.tar.gz4、安装依赖 yum install zlib yum install zlib-devel5、执行操作命令 cd /home/git/git-2.42.0 ./co…

华为云CodeArts Check代码检查服务用户声音反馈集锦(8)

作者&#xff1a;gentle_zhou 原文链接&#xff1a;CodeArts Check代码检查服务用户声音反馈集锦&#xff08;8&#xff09;-云社区-华为云 CodeArts Check&#xff08;原CodeCheck&#xff09;&#xff0c;是自主研发的代码检查服务。建立在华为30年自动化源代码静态检查技术…

张量-算术操作函数

tf.add(x,y,name None)求和函数 示例代码如下: import tensorflow.compat.v1 as tf tf.disable_v2_behavior()x 1 y 2a tf.add(x,y)with tf.Session() as sess:print(sess.run(a)) tf.subtract(x,y,name None)减法函数 示例代码如下: import tensorflow.compat.v1 as …

吐血整理,最全Pytest自动化测试框架快速上手(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 pytest框架 pyte…

前端【响应式图片处理】之 【picture标签】

目录 &#x1f31f;前言&#x1f31f;目前最常见的解决方案&#x1f31f;新的解决方案<picture>&#x1f31f;<picture>的工作原理&#x1f31f;<picture> 兼容性解决方案&#x1f31f;写在最后 &#x1f31f;前言 哈喽小伙伴们&#xff0c;前端开发过程中经…

<el-input> textarea文本域显示滚动条(超过高度就自动显示)

需求&#xff1a;首先是给定高度&#xff0c;输入文本框要自适应这个高度。文本超出高度就会显示滚动条否则不显示。 <el-row class"textarea-row"><el-col :span"3" class"first-row-title">天气</el-col><el-col :span&…