1. 程式人生 > >乘風破浪:LeetCode真題_034_Find First and Last Position of Element in Sorted Array

乘風破浪:LeetCode真題_034_Find First and Last Position of Element in Sorted Array

乘風破浪:LeetCode真題_034_Find First and Last Position of Element in Sorted Array

一、前言

    這次我們還是要改造二分搜尋,但是想法卻有一點不一樣。

二、Find First and Last Position of Element in Sorted Array

2.1 問題

2.2 分析與解決

   查詢問題,時間複雜度要求對數級別的,我們自然的想到了二分查詢,和上一題一樣,需求都是有點不一樣的,這次是有重複的數字,找出某一特定的重複的陣列的起始和結束位置,我們依舊要是有二分查詢,不過,當找到了目標值的時候,不能直接返回,需要判斷這個數值的左右是否有同樣的數字,如果左右都有,則繼續左右搜尋,如果左有右沒有則記錄結束為止並且向左搜尋,如果右有左沒有,則記錄左節點並且向右搜尋。

class Solution {
    // returns leftmost (or rightmost) index at which `target` should be
    // inserted in sorted array `nums` via binary search.
    private int extremeInsertionIndex(int[] nums, int target, boolean left) {
        int lo = 0;
        int hi = nums.length;

        while (lo < hi) {
            int mid = (lo + hi) / 2;
            if (nums[mid] > target || (left && target == nums[mid])) {//這一句非常重要
                hi = mid;
            }
            else {
                lo = mid+1;
            }
        }

        return lo;
    }

    public int[] searchRange(int[] nums, int target) {
        int[] targetRange = {-1, -1};

        int leftIdx = extremeInsertionIndex(nums, target, true);

        // assert that `leftIdx` is within the array bounds and that `target`
        // is actually in `nums`.
        if (leftIdx == nums.length || nums[leftIdx] != target) {
            return targetRange;
        }

        targetRange[0] = leftIdx;
        targetRange[1] = extremeInsertionIndex(nums, target, false)-1;

        return targetRange;
    }
}

 

三、總結

    通過改造二分搜尋,我們可以得到正確的答案,但是我們同樣也看到了,演算法的簡練渡和通用性的重要意義。