34.在排序數組中查找元素的起始和末尾位置

輸入: nums = [5,7,7,8,8,10], target = 8
輸出: [3,4]
找不到輸出[-1,-1]

先找到第一個nums[mid]=target的mid,然後分別查找左右。
當時覺得還不錯,一運行時間和線性查找差不多。

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        int begin=left;
        int end=right;
        while (left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]==target){
                if(mid-1>=0&&target>nums[mid-1]) begin=mid;
                else begin=search(nums,target,left,mid-1,begin,0);

                if(mid+1<nums.length&&target<nums[mid+1]) end=mid;
                else end=search(nums,target,mid+1,right,end,1);
                return new int[]{begin,end};
            }
            if(nums[mid]>target) right=mid-1;
            else left=mid+1;
        }
        return new int[]{-1,-1};
    }
    private int search(int[] nums,int target,int left,int right,int tep,int f){
        if(left>right) return tep;

        while (left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]==target){
                int te=search(nums,target,left,mid-1,mid,0);
                int ta=search(nums,target,mid+1,right,mid,1);
                if(f==0){
                    return Math.min(te,ta);
                }else{
                    return Math.max(ta,te);
                }
            }
            if(nums[mid]>target) right=mid-1;
            else left=mid+1;
        }
        return tep;
    }
}

下面這段代碼十分的簡介。二分,如果相等,那麼看需求區間左移還是右移。

class Solution {
    public int[] searchRange(int[] nums, int target) {
       int begin=findLeft(nums,target);
       int end=findRight(nums,target);
       return new int[]{begin,end};
    }

    private int findRight(int[] nums, int target) {
        int ans=-1;
        int left=0;
        int right=nums.length-1;
        while (left<=right){
            int mid=left+((right-left)>>1);
            if(nums[mid]==target){
                ans=mid;
                left=mid+1;
            }else if(nums[mid]>target){
                right=mid-1;
            }else{
                left=mid+1;
            }
        }
        return ans;
    }

    private int findLeft(int[] nums,int target){
        int ans=-1;
        int left=0;
        int right=nums.length-1;
        while (left<=right){
            int mid=left+((right-left)>>1);
            if(nums[mid]==target){
                ans=mid;
                right=mid-1;
            }else if(nums[mid]>target){
                right=mid-1;
            }else{
                left=mid+1;
            }
        }
        return ans;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章