剑指offer题目练习
题目描述: 统计一个数字在升序数组中出现的次数。
输入:[1,2,3,3,3,3,4,5],3
输出:4
题目解析: 一般出现有序数组需要利用这个条件,我们也可以使用暴力便利数组,找到与目标值相同的个数,但是出现有序我们应该考虑二分法节约查找时间。
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int count=0;
int low=0;
int mid=0;
int high=array.length;
while(low<high){
mid=(low+high)/2;
if(array[mid]<k){
low=mid+1;
}
else if(array[mid]>k){
high=mid-1;
}
else{
for(int i=low;i<high;i++){
if(array[i]==k){
count++;
}
}
low=high;
}
}
return count;
}
}
我的思路就是设置三个站点,将数组分成一个片段,利用条件排除,最终我们可以直接在这个片段中遍历,找到目标值的个数,最差情况第一次就访问的中间值就是目标值,此时需要遍历整个数组,此时和暴力遍历一样。注意最后一下low=high,当遍历完片段之后我们要跳出循环。