zoukankan      html  css  js  c++  java
  • 34. Find First and Last Position of Element in Sorted Array + 二分

    题意懒得抄了,大概是:在升序数组中给定整数target,找到第一个和最后一个target的索引,找到返回{index1, index2},否则返回{-1, -1};

    时间复杂度要求:O(logn)

    分析:要求对数时间,又是查找,我们不难想到二分查找。但是有一点,怎么查到第一个和最后一个呢?这困扰了我。

    算法:来自leetcode caikehe

    1. 使用二分变体,查找target作为index1,再找target+1, 作为index2;

    2. 对index做判断,如果它未越界且它的对应值等于target则返回{index1, index2-1};否则,返回{-1, -1};

    源码

    class Solution {
    public:
        vector<int> searchRange(vector<int>& nums, int target) {
            //binary find
            int index1 = binarySearch(nums, target);
            int index2 = binarySearch(nums, target+1) - 1;
            if(index1 < nums.size() && nums[index1] == target)
                return {index1, index2};
            return {-1, -1};
        }
        //二分变体
        int binarySearch(vector<int>& nums, int target)
        {
            int l = 0, r = nums.size()-1;
            while(l <= r)
            {
                int mid = l + (r-l)/2;
                if(nums[mid] < target)
                    l = mid + 1;
                else
                    r = mid -1;
            }
            return l;
        }
    };

     一个较为易于理解的算法(时间复杂度可能略高于两次二分)

     1 class Solution {
     2 public:
     3     vector<int> searchRange(vector<int>& nums, int target) {
     4         int len = nums.size();
     5         if(len <= 0)
     6             return {-1, -1};
     7         if(len == 1)
     8             if(nums[0] == target)
     9                 return {0, 0};
    10             else
    11                 return {-1, -1};
    12             
    13         
    14         int l = 0, r = len-1, mid;
    15         while(l <= r)
    16         {
    17             mid = l + (r-l)/2;
    18             if(nums[mid] == target)
    19                 break;
    20             else if(nums[mid] > target)
    21                 r = mid - 1;
    22             else
    23                 l = mid + 1;
    24         }
    25         if(nums[mid] != target)
    26             return {-1, -1};
    27         
    28         l = mid, r = mid;
    29         while(l >= 0 && nums[l] == nums[mid])
    30             l--;
    31         while(r < len && nums[r] == nums[mid])
    32             r++;
    33         return {l+1, r-1};
    34     }
    35 };
  • 相关阅读:
    信息竞赛日志
    Lesson0423
    考试总结
    2020省队选拔前(4.13-5.31)计划
    mvcc浅析
    浅谈cgi和fastcgi
    mysql事务
    mysql慢sql优化总结
    简述缓存击穿 / 缓存雪崩 / 缓存穿透 以及各自的解决方案
    PHP的异常处理机制浅析
  • 原文地址:https://www.cnblogs.com/yocichen/p/11104009.html
Copyright © 2011-2022 走看看