leetcode-34. Search for a Range

来源:互联网 发布:如何做好一个淘宝运营 编辑:程序博客网 时间:2024/05/16 02:47

leetcode-34. Search for a Range

题目:

Given a sorted array of integers, 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].

For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].

既然要logn肯定是要二分找了,基本思路就是先二分找到target,如果没有就返回[-1,-1]。
如果找到了target在依次去找target的左端点和右端点。

public class Solution {    public int[] searchRange(int[] nums, int target) {        int [] ret = new int[2];        ret[0]=-1;        ret[1]=-1;        int left = 0,right = nums.length-1,mid = 0;        while(left <= right){            mid = (left + right)/2;            if(target == nums[mid]) break;            if(nums[mid]<target) left = mid + 1;            if(nums[mid]>target) right = mid - 1;        }        if(target==nums[mid]){            ret[0] = findleft(nums,target,mid);            ret[1] = findright(nums,target,mid);        }        return ret;    }    private int findleft(int[] nums,int target, int right){        int left = 0;        while(left <= right){            int mid = (left+right)/2;            if(nums[mid]==target){                if( mid==0 || nums[mid-1]!=target)                    return mid;                else                    right = mid-1;            }else{                left = mid + 1;            }        }        return right;    }    private int findright(int[] nums,int target, int left){        int right = nums.length-1;        while(left <= right){            int mid = (left+right)/2;            if(nums[mid]==target){                if( mid==nums.length-1 || nums[mid+1]!=target)                    return mid;                else                    left = mid + 1;            }else{                right = mid-1;            }        }        return left;    }}
0 0
原创粉丝点击