1. 程式人生 > >34. 在排序陣列中查詢元素的第一個和最後一個位置

34. 在排序陣列中查詢元素的第一個和最後一個位置

在排序陣列中查詢元素的第一個和最後一個位置

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

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

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

思路+程式碼+註釋:

class Solution {
    public int[] searchRange(int[] nums, int target) {
        /*
            思路:使用二分查詢,查詢到值等於target的元素後,如果該元素大於前面的數那麼該元素就是起始位置,否則起始位置在該元素左邊
            如果該元素小於後面的數那麼該元素就是終止位置
             */
            int startIndex=-1;
            int endIndex=-1;
            int low=0;
            int high=nums.length-1;
            while (low<=high)
            {
                int mid=(low+high)/2;
                if (nums[mid]==target)
                {
                    //mid等於0是第一個元素肯定是起始位置
                    if (mid==0 || nums[mid]>nums[mid-1])
                    {
                        //找到起始位置
                        startIndex=mid;
                        break;
                    }else {
                        //mid前還有相等的元素,startIndex應該在左邊
                        high=mid-1;
                    }
                }else if (nums[mid]<target)
                {
                    low=mid+1;
                }else {
                    high=mid-1;
                }
            }

        low=0;
        high=nums.length-1;
        while (low<=high)
        {
            int mid=(low+high)/2;
            if (nums[mid]==target)
            {
                //mid是最後一個元素肯定是終止位置
                if (mid==nums.length-1 || nums[mid]<nums[mid+1])
                {
                    //找到終止位置
                    endIndex=mid;
                    break;
                }else {
                    //mid後還有相等的元素,endIndex應該在右邊
                    low=mid+1;
                }
            }else if (nums[mid]<target)
            {
                low=mid+1;
            }else {
                high=mid-1;
            }
        }
        return new int[]{startIndex,endIndex};
    }
}