题目
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
解题思路
有题目可以,nums是一个非递减数组
- 一次遍历数组,时间复杂度O(n)
- 当nums[i] == target,出现次数+1
- nums[i] > target,结束循环
- 二分查找,时间复杂度O(logn)
- 分别找到nums[left] == target和nums[right] == target
- target出现次数 = right - left + 1
代码
一次遍历数组
class Solution {
public int search(int[] nums, int target) {
int ans = 0;
for (int num : nums) {
if (num > target) return ans;
else if (num == target) ans++;
}
return ans;
}
}
二分查找
class Solution {
public int search(int[] nums, int target) {
if (nums.length == 0) return 0;
int left = searchLeft(nums, target);
int right = searchRight(nums, target);
if (right < 0 || left < 0) return 0;
return right - left + 1;
}
private int searchLeft(int[] nums, int target) {
int l = 0, r = nums.length - 1;
while (l + 1 < r) {
int mid = l + (r - l) / 2;
if (nums[mid] < target) l = mid;
else r = mid;
}
if (nums[l] == target) return l;
if (nums[r] == target) return r;
return -1;
}
private int searchRight(int[] nums, int target) {
int l = 0, r = nums.length - 1;
while (l + 1 < r) {
int mid = l + (r - l) / 2;
if (nums[mid] <= target) l = mid;
else r = mid;
}
if (nums[r] == target) return r;
if (nums[l] == target) return l;
return -1;
}
}