34. 在排序數組中查找元素的第一個和最后一個位置

題目:

給定一個按照升序排列的整數數組 nums,和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。

你的算法時間復雜度必須是 O(log n) 級別。

如果數組中不存在目標值,返回 [-1, -1]。

示例:

image.png

思路:

二分查找(二分查找很簡單,細節(jié)很重要)
通過查找一個數的左邊界,可以找到目標數的左邊界;
然后查找比目標數大一的數(target = 8 ----> 找8+1)的左邊界,這個數的左邊界 -1 就是目標數的右邊界。

重點:
怎么通過二分查找,找到目標數的左邊界?

參考:作者:labuladong
鏈接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/er-fen-cha-zhao-suan-fa-xi-jie-xiang-jie-by-labula/
來源:力扣(LeetCode)
著作權歸作者所有。商業(yè)轉載請聯系作者獲得授權,非商業(yè)轉載請注明出處。

代碼:

int left_bound(int[] nums, int target) {
    if (nums.length == 0) return -1;
    int left = 0;
    int right = nums.length; // 注意
    
    while (left < right) { // 注意
        int mid = (left + right) / 2;
        if (nums[mid] == target) {
            right = mid;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid; // 注意
        }
    }
    return left;
}

代碼:

class Solution {
    public int[] searchRange(int[] nums, int target) {
       //查找目標數的左邊界
       int first = binarySearch(nums, target);
       //查找目標數的右邊界(即目標數+1的數的左邊界-1)
       int last = binarySearch(nums, target + 1) - 1;
       //如果左邊界等于數組長度,即目標數比數組所有數都大
       //或者左邊界的數不等于目標數,目標數比所有數都小
       if (first == nums.length || nums[first] != target) {
           //即,找不到目標數,就返回-1
           return new int[]{-1, -1};
       } else {
           //否則,返回左右邊界。
           return new int[]{first, last};
       }
    } 

    //查找左邊界的二分查找
    public int binarySearch(int[] arr, int target) {
        int l = 0;
        int h = arr.length;
        //注意條件是l<h
        while (l < h) {
            int mid = l + ((h - l) >>> 1);
            if (target <= arr[mid]) {
                h = mid;
            } else if (target > arr[mid]) {
                l = mid + 1;
            }
        }
        return l;
    }
}

時間復雜度:O(logn),空間復雜度:O(1)

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容