题目描述 统计一个数字在排序数组中出现的次数。示例 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%的用户
-------------本文结束 感谢您的阅读-------------
文章对您有帮助,可以打赏一杯咖啡,鼓励我继续创作!