题目的链接在这里:https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2
题目大意
给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数数据范围:0 \le n \le 1000 , 0 \le k \le 1000≤n≤1000,0≤k≤100,数组中每个元素的值满足 0 \le val \le 1000≤val≤100
要求:空间复杂度 O(1)O(1),时间复杂度 O(logn)O(logn)
一、示意图
二、解题思路
二分
二分
代码如下:
public class Solution {
int count=0;
public int GetNumberOfK(int [] array , int k) {
//统计k在数组中出现的次数 排除暴力和数据结构的方法
//二分法
int start=0;
int end=array.length-1;
BinarySearch(array,start,end,k);
return count;
}
private void BinarySearch(int[] array, int start, int end, int k) {
//二分方法
if(start>end)
return;
int mid=(start+end)/2;
//然后直接判断mis
if(array[mid]==k){
count++;
//相同的话 就可能两边都需要遍历
BinarySearch(array,start,mid-1,k);
BinarySearch(array,mid+1,end,k);
}
//然后遍历两边
else if(array[mid]>k){
//说明在右边
BinarySearch(array,start,mid-1,k);
}
else{
BinarySearch(array,mid+1,end,k);
}
}
}