在排序数组中查找数字 I

题目描述

统计一个数字在排序数组中出现的次数。
示例 1:

1
2
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2

示例 2:

1
2
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0

限制:
0 <= 数组长度 <= 50000

题目链接

Leetcode

题目解答

解法一

顺序查找,遍历数组统计target出现的次数。

时间复杂度:$O(n)$ 空间复杂度:$O(1)$

1
2
3
4
5
6
7
8
9
10
class Solution {
public int search(int[] nums, int target) {
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == target) count++;
if (nums[i] > target) return count;
}
return count;
}
}

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:41.2 MB, 在所有 Java 提交中击败了77.38%的用户

解法二

二分查找,使用二分先找到target所在的位置,然后往两边扩散,这样能充分利用数组的有序性,也能避免查找目标有多个情况下,查找遗漏的问题。

时间复杂度:$O(\log{}n)$ 空间复杂度:$O(1)$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] > target) {
right = mid - 1;
} else {
if (nums[mid] == target) {
int l = mid - 1, r = mid + 1, c = 1;
while (l >= 0 && nums[l--] == target) c++;
while (r < nums.length && nums[r++] == target) c++;
return c;
}
left = mid + 1;
}
}
return 0;
}
}

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:41.1 MB, 在所有 Java 提交中击败了94.23%的用户

-------------本文结束 感谢您的阅读-------------

文章对您有帮助,可以打赏一杯咖啡,鼓励我继续创作!