34. Find First and Last Position of Element in Sorted Array

Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

Example 1:

Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]

Example 2:

Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] res = {-1,-1};
        int left = 0, right = nums.length - 1;
        int l = -1, r = -1;
        while(left <= right){
            int mid = left + (right-left)/2;
            if(nums[mid] == target){
                l = mid;
                r = mid;
                while((l-1) > -1 && nums[l-1] == target){
                    l--;
                }
                while((r+1) < nums.length && nums[r+1] == target){
                    r++;
                }
                break;//!!
            }
            else{
                if(nums[mid] > target){
                    right = mid - 1;
                }
                else left = mid + 1;
            }
        }
        res[0] = l;
        res[1] = r;
        return res;
    }
}

 

 

Binary Search。之所以要break是因为一旦所有符号条件的数选完就不会进入到下面的else,也不会更新right和left,所以会有time limit error。因此当得到l和r就应该break。

总结:Using two pointers again, first is to use binary search to find the first target, then make l = mid and r = mid, expand in two directions and break. Then l is the first index, r is the last index. Including the situations that nums.length == 0/1 or only 1 target in array.

public int[] searchRange(int[] nums, int target) {
        if (nums.length == 0) {
            return new int[]{-1, -1};
        }

        // binary search to find first
        int l = 0, r = nums.length - 1;
        while (l < r) {
            int mid = l + (r-l) / 2;
            if (nums[mid] >= target) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        int first = l;
        if (nums[first] != target) {
            return new int[]{-1, -1};
        }

        l = 0; r = nums.length - 1;
        while (l < r) {
            int mid = l + (r-l)/2 + 1;
            if (nums[mid] <= target) {
                l = mid;
            } else {
                r = mid - 1;
            }
        }
        return new int[]{first, l};
    }   

https://www.1point3acres.com/bbs/thread-778386-1-1.html

posted @ 2019-01-29 02:43  Schwifty  阅读(140)  评论(0编辑  收藏  举报