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; } }