首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode Search for a Range:二分查找確定目標值區間

     編輯:關於C++

問題描述

給定升序數組(可含重複),找到目標值 target 的起始和結束位置。要求 O(log n)。不存在返回 [-1, -1]。

解法:兩次二分查找

  1. 找左邊界:第一個 ≥ target 的位置(lower_bound)
  2. 找右邊界:第一個 > target 的位置(upper_bound)減 1
  3. 若左邊界值 ≠ target,返回 [-1, -1]

vector searchRange(vector& nums, int target) {
    auto lower = lower_bound(nums.begin(), nums.end(), target);
    if (lower == nums.end() || *lower != target) return {-1, -1};
    auto upper = upper_bound(nums.begin(), nums.end(), target);
    return {int(lower - nums.begin()), int(upper - nums.begin()) - 1};
}

手寫二分(面試常考)


int lowerBound(vector& a, int target) {
    int l=0, r=a.size();
    while (l < r) {
        int m = l + (r-l)/2;
        if (a[m] < target) l = m+1;
        else r = m;
    }
    return l;
}
int upperBound(vector& a, int target) {
    int l=0, r=a.size();
    while (l < r) {
        int m = l + (r-l)/2;
        if (a[m] <= target) l = m+1;
        else r = m;
    }
    return l;
}

複雜度

  • 時間:O(log n)
  • 空間:O(1)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved