当前位置: 首页 > news >正文

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

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

首先想到暴力遍历记录,但是复杂度为O(n),其次想到利用二分找到一个目标后开始向左右附近找,其实本质是二分加暴力,时间复杂度也不达到要求,不过能跑

class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
        int i=0,j=0;
       int left = 0;
        int right = nums.size() - 1;
        while (left <= right)
         {
            int middle = left + ((right - left) / 2);
            if (nums[middle] > target) {
                right = middle - 1;         
            } 
            else if(nums[middle] < target) {
                left = middle + 1;
            }
            else{//找到一个target,开始往左 往右试探
                i=middle;
                j=middle;
                while(i>0&&nums[i-1]==nums[i])//往左试探
                {
                    i--;
                }
                    while(j<nums.size()-1&&nums[j+1]==nums[j])//往右试探
                {
                    j++;
                }
                 return vector<int>{i,j};
            } 
        }
        return  vector<int>{-1,-1};
    }

};

 

纯二分的思路不是找目标数,而是找目标数的左右边界

  1. 先通过二分查找找到目标值。
  2. 然后再去查找它的左右边界。如果找的是它左边界,那么就继续向左面查找。
  3. 查找右边界同理。
  4. 查找左边界和右边界的方法几乎相同,因此我将它们写在一个函数中,用一个boolean类型判断它是否是左边界。
  5. 当查找到目标值后,判断我们想要查找的是否是左边界。如果是,就继续向目标值的左面查(right = mid - 1);如果不是,就向右面查找。最后返回最终的边界值。

个人感觉这种最好理解

class Solution {
public:
int SerachTT(vector<int>& nums, int target,bool ifleft) {
        int ref=-1;//标记
        int left = 0;
        int right = nums.size() - 1;
        while (left <= right)
         {
            int middle = left + ((right - left) / 2);
            if (nums[middle] > target) {
                right = middle - 1;         
            } 
            else if(nums[middle] < target) {
                left = middle + 1;
            }
            else{
                //此时nums[middle] == target
                ref=middle;
                if(ifleft){//如果找到的这个是左边界了
                    right = middle - 1;//往左边走
                }else{
                    left = middle + 1;//往右走
                }
            }       
        }
        return ref;//找到的一个边界 
    }

vector<int> searchRange(vector<int>& nums, int target) {
       
        int left=SerachTT(nums,target,true);//左边界
        int right=SerachTT(nums,target,false);//右边界
         return vector<int>{left,right};    
    }

};

 

 

相关文章:

  • 【论文阅读】Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping
  • Java8 特性(二):Optional 相关操作
  • y119.第七章 服务网格与治理-Istio从入门到精通 -- Istio流量治理快速入门(五)
  • 以字符串的形式返回文件名扩展名
  • 机械硬盘数据拷贝
  • 计算机毕业设计java毕设项目之ssm中医药配方小程序
  • 【C++】内存管理 + 初识模板
  • 猿创征文|我的技术成长之路,一名Python学者在CSDN的蜕变
  • java基于ssm的高校人事员工工资管理系统
  • QML初学者教程
  • 速卖通详情接口接口调用示例
  • 记录Kettle连不上mysql8
  • 远程Debug远端服务器JVM配置
  • Java中的内部类,你真的理解吗
  • Home Depot 使用 SUSE Rancher 和 K3s 升级 2300 个零售边缘位置
  • canvas绘制圆角头像
  • Java程序员幽默爆笑锦集
  • MaxCompute访问TableStore(OTS) 数据
  • Python学习之路13-记分
  • react-native 安卓真机环境搭建
  • tensorflow学习笔记3——MNIST应用篇
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 成为一名优秀的Developer的书单
  • 初探 Vue 生命周期和钩子函数
  • 订阅Forge Viewer所有的事件
  • 技术胖1-4季视频复习— (看视频笔记)
  • 通过npm或yarn自动生成vue组件
  • 一个项目push到多个远程Git仓库
  • 最简单的无缝轮播
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 阿里云移动端播放器高级功能介绍
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #微信小程序:微信小程序常见的配置传旨
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (16)Reactor的测试——响应式Spring的道法术器
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (力扣)1314.矩阵区域和
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (排序详解之 堆排序)
  • .Net 4.0并行库实用性演练
  • .NET 表达式计算:Expression Evaluator
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @ModelAttribute 注解
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [bzoj1038][ZJOI2008]瞭望塔
  • [C++]STL之map
  • [CDOJ 838]母仪天下 【线段树手速练习 15分钟内敲完算合格】
  • [CQOI 2010]扑克牌
  • [Design Pattern] 工厂方法模式
  • [java后端研发]——文件上传与下载(2种方式)