首页 > 其他分享 >leet Code [34. Find First and Last Position of Element in Sorted Array]

leet Code [34. Find First and Last Position of Element in Sorted Array]

时间:2022-10-13 16:35:57浏览次数:77  
标签:leet Code Last target nums middle right 边界 left

[34. Find First and Last Position of Element in Sorted Array]

(https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/)

image-20221013153928527

二分法

  • 此题不像之前的二分查找题目,若只用一个二分查找很混乱,因此我推荐用两个二分法更为得当,分别去找满足条件的左右边界

  • 寻找target的左右边界,存在三种情况:

    • target不满足数组内大小范围
    • target满足数组大小范围,但数组内不存在target
    • target既满足数组大小范围,且数组内存在target
  • 接下来即可运用两个二分法(左闭右闭)去找满足条件的左右边界:

    • 左边界:若数组中存在target的话,那么最后一轮循环,left和right都必将指向target值,又因为 if( nums[middle] >= target ) right = middle - 1,right肯定会指向最左边的target。最后,right会继续向左移动,因此left是左边界的答案

      while(left <= right)
      {
          int middle = left + ( ( right - left ) >> 1 );
      
          if( nums[middle] >= target ) right = middle - 1;
          else left = middle + 1;
      }
      
      int L = left;
      
    • 右边界:与左边界同理

      while(left <= right)
      {
          int middle = left + ( ( right - left ) >> 1 );
      
          if( nums[middle] <= target ) left = middle + 1;
          else right = middle - 1;
      }
      
      int R = right;
      
    • 全部实现:

      class Solution {
      public:
          vector<int> searchRange(vector<int>& nums, int target) {
              if( nums.size() == 0 ) return { -1, -1 };
      
              int left = 0, right = nums.size() - 1;
      
              while(left <= right)
              {
                  int middle = left + ( ( right - left ) >> 1 );
      
                  if( nums[middle] >= target ) right = middle - 1;
                  else left = middle + 1;
              }
      
              //左边界
              int L = left;
              
              left = 0, right = nums.size() - 1;
      
              while(left <= right)
              {
                  int middle = left + ( ( right - left ) >> 1 );
      
                  if( nums[middle] <= target ) left = middle + 1;
                  else right = middle - 1;
              }
      
              //右边界
              int R = right;
      
              //处理三种情况
              if( L > R ) return {-1, -1};
      
              return {L, R};
          }
      };
      
    • 时间复杂度:O(logn)

      空间复杂度:O(1)

标签:leet,Code,Last,target,nums,middle,right,边界,left
From: https://www.cnblogs.com/chenglixue/p/16788596.html

相关文章

  • Codeforces Round #787 F
    F.VladandUnfinishedBusiness和一般的求多个点都到达的最小距离不同这里规定了终点这样我们首先x-y这条链可以确定当然我们这条链可以通过让path[y]等于1因为树中......
  • 【DSP视频教程】DSP视频教程第6期:Matlab和VSCode联调,使用贼舒服,大大方便测试验证,全程
    ​​​​ 本期视频教程给大家来一期Matlab和VSCode联调教程。设置后,大家无需打开Matlab就可以方便的做matlab相关测试。视频:​​https://www.bilibili.com/video/BV1z5411U......
  • Fleet公测啦!真的轻量?
    就在昨天晚上8点多,我收到了一封邮件,看到标题引起了我的注意。虽然已经听说过很多关于Fleet的传闻了,包括也有内测的大佬使用过了。但是!这次可是公测了呀!于是立马花了将近......
  • 前端Unicode转码的好处
    站长工具支持Unicode转码:​​http://tool.chinaz.com/Tools/Unicode.aspx​​(这是一个网页标题)转码后------>变为:\u8fd9\u662f\u4e00\u4e2a\u7f51\u9875\u6807\u9898这样做......
  • Codeforces Round #721 C
    C.SequencePairWeight我们发现不管是分组内计算或者是暴力都是不可取的我们思考反想一对相同数能够有算进多少种方式显然是i*(n-i+1)的组合数显然要是有第三个相同......
  • 学习日记--分治(leetcode 53 最大子数组和)
    采用了leetcode官方思路--分治思路:求区间内的最大子段和structStatus{intlSum,rSum,mSum,iSum;};/*结构体用法:struct结构体名{  结构......
  • leetcode 220. Contains Duplicate III 存在重复元素 III(困难)
    一、题目大意给你一个整数数组nums和两个整数k和t。请你判断是否存在两个不同下标i和j,使得abs(nums[i]-nums[j])<=t,同时又满足abs(i-j)<=k。如果......
  • vscode配置C语言
    1、下载编译器MinGW并解压即可下载下载页面中选择x86_64-win32-seh下载添加环境变量:在系统变量的PATH中添加bin文件夹2、安装插件因最新版本不会自动生成l......
  • 取消xcode每次运行都提示输入用户名密码
     每次修改了代码都让输入,就很不方便,只需要以下简单操作即可。1、打开你的钥匙串  2、找到你项目的证书下的小钥匙  3、双击找到访问控......
  • 【第3版emWin教程】第32章 emWin6.x的矢量字体(支持汉字全字库,Unicode编码,QSPI F
    ​​​​第32章      emWin6.x的矢量字体(支持汉字全字库,Unicode编码,QSPIFlash方案)本期教程跟大家讲解矢量字体的相关知识,矢量字体最大的好处就是可以任意放大或者缩......