题目
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
限制:
0 <= 数组长度 <= 50000
代码
方法一 使用HashMap
使用hashMap对数字出现过的数字进行计数(不过这样就利用不到数字在排序数组中的特性了
时间复杂度也是O(n) 空间复杂度也是O(n)
就不够优雅(
class Solution {
public static int search(int[] nums, int target) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
hashMap.put(nums[i], hashMap.getOrDefault(nums[i], 0) + 1);
}
if (hashMap.containsKey(target)) {
return hashMap.get(target);
}else {
return 0;
}
}
}
方法二 优雅的二分法
其实也挺容易想到的吧(
因为是递增的数组所以我们只需要利用好这个特性对其进行二分查找后在其左右进行检索就okay惹!
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
int count = 0;
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] >= target)
right = mid;
if (nums[mid] < target)
left = mid + 1;
}
while (left < nums.length && nums[left++] == target)
count++;
return count;
}
}