1. 程式人生 > 其它 >【資料結構】演算法 排序陣列中查詢元素的第一個和最後一個位置 Find First And Last Position of Element in Sorted Array

【資料結構】演算法 排序陣列中查詢元素的第一個和最後一個位置 Find First And Last Position of Element in Sorted Array

目錄

排序陣列中查詢元素的第一個和最後一個位置 Find First And Last Position of Element in Sorted Array

給定一個非遞減排序陣列nums 和目標target.找到target在陣列中的開始位置和結束位置。如果陣列中不存在這個數,返回[-1,-1]

nums = [5,7,7,8,8,10], target = 7
[1,2]

思路

這個要求,查到target的第一個位置和最後一個位置。

如何查第一個位置?

因為是有序的,可以通過二分查詢來定位。

如何查詢最後一個位置?

因為是有序的,在二分查詢中,設定l,r逼近目標mid,返回最後一個位置。

 public int[] searchRange(int[] nums, int target) {
        int[] ans = new int[]{-1,-1};
        int pos = 0;
        int first = searchfirst01(nums,pos, target);
        if(first==nums.length||nums[first]!=target){
            return ans;
        }
        pos = first;
        int last = searchfirst01(nums, pos,target+1)-1;
        ans[0] = first;
        ans[1] = last;
        return ans;
    }
    public int searchfirst01(int[] arr,int pos, int target){
        if(arr.length==0){
            return -1;
        }
        int l = pos ;
        int r = arr.length-1;
        int mid = 0;
        while (r-l>3){
            mid = (l+r)>>1;
            if(arr[mid]>=target){
                r = mid;
            }
            else{
                l =mid+1;
            }
        }
        for (int i = l; i <=r ; i++) {
            if (arr[i]>=target){
                return i;
            }
        }
        return arr.length;
    }

searchfirst01 用來尋找陣列中滿足 x>=target的第一個位置,如果是target==7,就返回第一個位置;要想定位最後一個位置,就嘗試尋找第一個x>=8的位置,然後-1;如果找不到滿足條件的位置,就返回陣列長度

Tag

math binary search