解法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;
}
}
京公网安备 11010502036488号