目录
一、题目描述
统计一个数字在排序数组中出现的次数。
示例 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
class Solution {
public int search(int[] nums, int target) {
}
}
二、思路讲解
1、方法一
暴力查找。
2、方法二
二分查找改进。题目中的数组是已经排好序的,故而可以想到二分查找。
并且,在二分查找的基础上仍可以优化:当左边的数字小于target时,不可能找到了,可以直接break;同理,右边的数字大于target时,也可以直接break。
三、算法描述
1、方法一
遍历数组nums,若与target相等,则计数加一。
2、方法二
使用二分查找,若与target相等,则计数加一;一旦左边的指针指向的数小于target、右边的指针指向的数大于target时,可以提前结束。
四、Java代码实现
1、方法一
class Solution {
public int search(int[] nums, int target) {
int count = 0;
for(int i=0; i<nums.length; i++) {
if(target == nums[i]) {
count++;
}
}
return count;
}
}
2、方法二
if (nums.length == 0) {
return 0;
}
int sum = 0;
int mid = nums.length >> 2;
if (nums[mid] == target) {
sum++;
}
int i = mid, j = mid;
while (i > 0 || j < nums.length - 1) {
if (i > 0) {
if (nums[i] >= target) {
i--;
if (nums[i] == target) {
sum++;
}
} else {
i = -1;
}
}
if (j < nums.length - 1) {
if (nums[j] <= target) {
j++;
if (nums[j] == target) {
sum++;
}
} else {
j = nums.length;
}
}
}
return sum;
五、时空复杂度分析
1、方法一
时间复杂度:O(n) 遍历数组nums
空间复杂度:O(1)
2、方法二
时间复杂度:O(logn) 二分查找的时间复杂度为logn
空间复杂度:O(1)