统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
提示:
- 0 <= nums.length <= 105
- -109 <= nums[i] <= 109
- nums 是一个非递减数组
- -109 <= target <= 109
分析:
方法1:朴素算法
直接遍历数组,记录该数字出现的次数,如果当前数大于该数,停止遍历。
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public int search(int[] nums, int target) {
//记录次数
int count = 0;
//遍历
for(int n: nums){
//找到 target,次数加1
if(n == target){
count++;
}
//当前数大于 target,终止遍历
else if(n > target){
break;
}
}
return count;
}
}
方法2:二分法
每次取中间位置的数,该数大于 target,target 在左边,小于 target,target 在右边,因此我们可以找该数的右边界,然后根据该右边界左遍历找到 target 的次数。
时间复杂度:O(log n)
空间复杂度:O(1)
class Solution {
public int search(int[] nums, int target) {
//数组为空
if(nums.length == 0){
return 0;
}
//定义双指针,二分点,左右边界,次数
int i = 0, j = nums.length - 1, index, count = 0;
//遍历,找右边界
while(i < j){
index = (i + j) / 2;
if(nums[index] <= target){
i = index + 1;
}
else{
j = index - 1;
}
}
//判断右边界是否为 target
if(nums[i] == target){
count = 1;
}
//遍历,记录次数
while(i > 0 && nums[--i] >= target){
count++;
}
return count;
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof