乘風破浪:LeetCode真題_034_Find First and Last Position of Element in Sorted Array
阿新 • • 發佈:2019-01-05
乘風破浪: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; } }
三、總結
通過改造二分搜尋,我們可以得到正確的答案,但是我們同樣也看到了,演算法的簡練渡和通用性的重要意義。