统计一个数字在排序数组中出现的次数。
示例 1 :
输入: nums = [ 5,7 ,7,8,8,10] , target = 8
输出: 2
示例 2 :
输入: nums = [ 5,7 ,7,8,8,10] , target = 6
输出: 0
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
public int search(int[] nums, int target) {
HashMap<Integer,Integer> maps=new HashMap<>();
for (int num : nums) {
maps.put(num,maps.getOrDefault(num,0)+1);
}
return maps.getOrDefault(target,0);
}
思路二
二分查找 使用二分查找 随意查找一个元素的的出现位置 因为是排序数组 所以相同的数字都是相邻的 查找到第一个数字同时向左右遍历 记录次数
public int search ( int [ ] nums, int target) {
int left= 0 ;
int right= nums. length- 1 ;
int mid= ( left+ right) / 2 ;
while ( left<= right) {
mid= ( left+ right) / 2 ;
if ( nums[ mid] == target) {
left= mid; right= mid;
while ( ( left- 1 >= 0 && nums[ left- 1 ] == target) || ( right+ 1 < nums. length && nums[ right+ 1 ] == target) ) {
if ( left- 1 >= 0 && nums[ left- 1 ] == target) {
left-= 1 ;
}
if ( right+ 1 < nums. length && nums[ right+ 1 ] == target) {
right++ ;
} ;
}
return right- left+ 1 ;
} else if ( nums[ mid] < target) {
left= mid+ 1 ;
} else {
right= mid- 1 ;
}
}
return 0 ;
}