解法1:暴力求解:循环统计
查找数组中某个目标,不管数组是否有序,直接遍历一遍即可
public class Solution { public int GetNumberOfK(int [] array , int k) { if(array.length==0 || array==null){ return 0; } int count=0; for(int i=0;i<array.length;i++){ if(array[i]==k){ count++; } } return count; } }
解法2:二分:第一次出现和最后一次出现的下标
因为有序,所以目标值target如果有多个,肯定是连在一起。又已知我们可以在有序数组中查找任意一个值,因此我们可以先查找目标范围的下界和上界。
public class Solution { public int GetNumberOfK(int [] array , int k){ int num=0; if(array.length==0){ return 0; } int firstK=getFirstK(array,k,0,array.length-1); int lastK=getLastK(array,k,0,array.length-1); if(firstK>=0 && lastK>=0){ num=lastK-firstK+1; } return num; } //找到第一个出现的数字的下标 public int getFirstK(int[] array,int k,int start,int end){ while (start <= end) { int mid = start + ((end - start) >> 1); if (k <= array[mid]) end = mid - 1; else start = mid + 1; } if (start < array.length && array[start] == k) return start; else return -1; } //找到最后一个出现的数字的下标 public int getLastK(int[] array,int k,int start,int end){ while(start<=end){ int mid=start+((end-start)>>1); if(k>=array[mid]){ start=mid+1; } else{ end=mid-1; } } if(end>=0 && array[end]==k){ return end; } else return -1; } }