难度简单320
统计一个数字在排序数组中出现的次数。
示例 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
注意:本题与主站 34 题相同(仅返回值不同):力扣
思路:排序数组中的搜索问题,首先想到 二分法 ,具体参考 题解 及其算法分析流程图
时间复杂度:O(logN)
空间复杂度:O(1)
func search(nums []int, target int) int {
// 寻找右边界
i, j := 0, len(nums)-1
for i <= j { // 直至 i > j 跳出循环
mid := (i+j) / 2
if nums[mid] <= target { // 跟寻找左边界有区别,可以有等于的情况
i = mid + 1 // 为了在等于的情况下,能够让i能够往右多移动一次,导致 j < i
} else { // nums[mid] > target
j = mid - 1
}
}
right := i
// 寻找左边界
i, j = 0, len(nums)-1
for i <= j {
mid := (i+j)/2
if nums[mid] < target { // 跟寻找右边界有区别,不能有等于的情况
i = mid + 1
} else {
j = mid - 1 // 为了在等于的情况下,能够让j能够往左多移动一次,导致 j < i
}
}
left := j
return right - left - 1
// 参考评论区代码:https://leetcode.cn/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/solution/mian-shi-ti-53-i-zai-pai-xu-shu-zu-zhong-cha-zha-5/
// 此方法最坏情况下如:0、1、2、3、4、5、6、7、8、9时,时间复杂度为O(n)
// low, hight := 0, len(nums)-1
// for low <= hight {
// mid := (low + hight) / 2
// if nums[mid] < target {
// low = mid + 1
// } else if nums[mid] > target {
// hight = mid - 1
// } else if nums[mid] == target {
// if nums[low] == nums[hight] {
// return hight - low + 1 // 为啥是hight - low + 1
// } else if nums[low] < target {
// low++
// } else if nums[hight] > target {
// hight--
// }
// }
// }
// return 0
}