第一次出现的特征与最后一次出现的特征
数字在升序数组中出现的次数
http://www.nowcoder.com/questionTerminal/70610bf967994b22bb1c26f9ae901fa2
排序数组中,当相等时,需要区分第一次还是最后一次出现。
1.第一次:mid==0或者nums[mid-1]<nums[mid]
2. 最后一次出现: mid==nums.length-1或者nums[mid]<nums[mid+1]
需要分两次,不能同时找出第一次和最后一次。因为那时当相等时,就不知道如何移动了!!
首先要存在,然后再谈第一次和最后一次。
/** * 统计一个数字在升序数组中出现的次数。 * @param array 升序数组 * @param k 数字 * @return 出现的次数 */ public int GetNumberOfK(int [] array , int k) { int res=0; if(array==null||array.length==0){ return 0; } int first=getFirstK(array,k); int last=getLastK(array,k); if(first>-1&&last>-1){ res=last-first+1; } return res; } public int getFirstK(int[] array,int k){ int start=0,end=array.length-1; while (start<=end){ int mid=start+(end-start)/2; if(array[mid]<k){ start=mid+1; }else if(array[mid]>k){ end=mid-1; }else { //相等 if(mid==0||array[mid-1]<array[mid]){ return mid; }else { end=mid-1; } } } return -1; } public int getLastK(int[] array,int k){ int start=0,end=array.length-1; while (start<=end){ int mid=start+(end-start)/2; if(array[mid]<k){ start=mid+1; }else if(array[mid]>k){ end=mid-1; }else { //相等 if(mid==array.length-1||array[mid]<array[mid+1]){ return mid; }else { start=mid+1; } } } return -1; }