数字在排序数组中出现的次数
题目描述:
统计一个数字在排序数组中出现的次数。
知识点:
数组
解题思路:
【个人思路1】
统计数字出现的次数,第一想法就是首先遍历数组然后把出现的数字和次数保存在哈希表中,然后根据数字来寻找出现的次数。
具体代码:
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int num;
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int i=0;i<array.length;i++) {
if(map.containsKey(array[i])) {
map.put(array[i], map.get(array[i])+1);
}else {
map.put(array[i], 1);
}
}
if(map.containsKey(k))
num=map.get(k);
else
num=0;
return num;
}
}
注意点:
注意特殊测试用例的情况,当数组不包含该数字的时候。所以当输出出现次数之前需要先判断该哈希表中是否包含该数字。时间复杂度为O(n)。
【个人思路2】
题目说是有序数组,立马想到确定k时可以使用二分查找。找到k之后需要确定出现的次数,这个算是这个想法的难点。其实就是二分查找的变形,寻找到数字第一次出现的左边界和最后一次出现的右边界。
具体代码:
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int num;
int low,high;
low=binarySearchlow(array,k);
high=binarySearchhigh(array,k);
if(low==-1||high==-1)
return 0;
else
num=high-low;
return num+1;
}
private static int binarySearchhigh(int[] a, int k) {
// TODO Auto-generated method stub
int low=0,high=a.length-1,mid;
while(low<=high) {
mid=low+(high-low)/2;
if(k>=a[mid]) {
low=mid+1;
}else {
high=mid-1;
}
}
if(high>=0&&a[high]==k)
return high;
else
return -1;
}
private static int binarySearchlow(int[] a, int k) {
// TODO Auto-generated method stub
int low=0,high=a.length-1,mid;
while(low<=high) {
mid=low+(high-low)/2;
if(k<=a[mid]) {
high=mid-1;
}else {
low=mid+1;
}
}
if(low<a.length&&a[low]==k)
return low;
else
return -1;
}
}
注意点:
二分法的理解以及相关改进算法的理解。
参考资料:
二分法的变形:https://www.jianshu.com/p/0f823fbd4d20