[Leetcode]Search for a Range

No.34, Search for a Range

后面的还是用java写吧。

这道题主要是找target在排好序的数组中的起始位置,例如5 7 7 8 8 10里面找8,结果为3,4,即从index=3到index=4都是8。题目要求O(logn),即二分。

这道题可以先找左起点,再找右终点,2logn。

以找左起点为例,如果中间值小于目标,则找右半,其余找左半(如果中间值等于目标值,也是要找左半的,因为左半可能还有目标值)。left=right的情况也要计算,否则会漏,比如123找2,第一轮,left=0 right=2 mid=1然后right更新为0,此时必须再来一轮,left=0 right=0 mid=0,而1<2,left更新为1。但是一旦加上left=right的情况,如果中间值一直小于目标值,left一直加,加到了数组的长度,此时可能会越界,因此还需要加入越界判断。

找右终点同理。

当然可以把两个用一个boolean的参数合并成一个函数。

public class Solution {
        public int[] searchRange(int[] nums, int target) {
        int[] result=new int[2];
        result[0]=findPosL(nums,target);
        result[1]=findPosR(nums,target);
        
        return result;
    }
    public int findPosL(int[] a, int target){
        int left=0;
        int right=a.length-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(a[mid]<target){
                left=mid+1;
            }
            else{
                right=mid-1;
            }
        }
        if(left>=a.length||a[left]!=target)
            return -1;
        return left;
    }
    public int findPosR(int[] a, int target){
        int left=0;
        int right=a.length-1;
        while(left<=right){
            int mid=(left+right)/2;
            if(a[mid]>target){
                right=mid-1;
            }
            else{
                left=mid+1;
            }
        }
        if(right<0||a[right]!=target)
            return -1;
        return right;
    }
}

 

posted @ 2016-04-21 21:51  上官筱儿  阅读(135)  评论(0编辑  收藏  举报