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


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

    你的算法时间复杂度必须是 O(log n) 级别。

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

    示例 1:

    输入: nums = [5,7,7,8,8,10], target = 8
    输出: [3,4]
    示例 2:

    输入: nums = [5,7,7,8,8,10], target = 6
    输出: [-1,-1]

    logn级别的时间复杂度,可以直接想到二分法,分两次查找,第一次查找左边界,第二次查找右边界。

     1 class Solution {
     2 public:
     3     vector<int> searchRange(vector<int>& nums, int target) {
     4         if(nums.size()==0) return {-1,-1};
     5         int l=0,r=nums.size()-1,m;
     6         int retl=-1,retr=-1;
     7         //find left
     8         while(l<r-1){
     9             m=(l+r)/2;
    10             if(nums[m]<target){
    11                 l=m+1;
    12             }
    13             else if(nums[m]>target){
    14                 r=m-1;
    15             }
    16             else if(nums[m-1]==nums[m]){
    17                 r=m-1;
    18             }
    19             else{
    20                 retl=m;
    21                 break;
    22             }
    23         }
    24         if(retl==-1){
    25             if(nums[l]==target) retl=l;
    26             else if(nums[r]==target) retl=r;
    27             else return {-1,-1};
    28         }
    29         l=0,r=nums.size()-1;
    30         //find right
    31         while(l<r-1){
    32             m=(l+r)/2;
    33             if(nums[m]<target){
    34                 l=m+1;
    35             }
    36             else if(nums[m]>target){
    37                 r=m-1;
    38             }
    39             else if(nums[m+1]==nums[m]){
    40                 l=m+1;
    41             }
    42             else{
    43                 retr=m;
    44                 break;
    45             }
    46         }
    47         if(retr==-1){
    48             if(nums[r]==target) retr=r;
    49             else if(nums[l]==target) retr=l;
    50         }
    51         
    52         return {retl,retr};
    53     }
    54 };

    附上一个更加高效的写法,别人的思维真的很精准。

     1 class Solution {
     2 public:
     3     vector<int> searchRange(vector<int>& nums, int t) {
     4         if(nums.size()==0)return {-1,-1};
     5         vector<int> res;
     6         int l = 0, r = nums.size() - 1;
     7 
     8         //二分查找数组的性质 >=t 和 <=t
     9         //先二分左边边界 >=t
    10         while (l < r) {
    11             int mid = l + r >> 1;
    12             if (nums[mid] >= t)    r = mid;
    13             else l = mid + 1;
    14         }
    15         //判断是否有t 没有直接返回-1 -1
    16         if (nums[l] != t) return { -1,-1 };
    17         else {
    18             res.push_back(l);
    19             l = 0, r = nums.size() - 1;
    20             //右边边界 <=t 
    21             while (l < r) {
    22                 int mid = l + r +1>> 1;
    23                 if (nums[mid] <= t) l = mid;
    24                 else r = mid - 1;
    25             }
    26         }
    27         res.push_back(l);
    28         return res;
    29 
    30     }
    31 };
    32 
    33 作者:ni-hen-you-xiu-2
    34 链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/c-er-fen-cha-zhao-ying-yong-by-ni-hen-you-xiu-2/
    35 来源:力扣(LeetCode)
    36 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    RPC-Thrift(三)
    RPC-Thrift(二)
    RPC-Thrift(一)
    RPC-整体概念
    Java并发编程--ThreadPoolExecutor
    Java并发编程--Exchanger
    编译libjpeg库
    树莓派3B+ wifi 5G连接
    手动安装 pygame
    摘记 pyinstaller 使用自定义 spec
  • 原文地址:https://www.cnblogs.com/rookiez/p/13202715.html
Copyright © 2020-2023  润新知