这是第36篇算法,力扣链接
某班级考试成绩按非严格递增顺序记录于整数数组
scores
,请返回目标成绩target
的出现次数。示例 1:
输入: scores = [2, 2, 3, 4, 4, 4, 5, 6, 6, 8], target = 4 输出: 3示例 2:
输入: scores = [1, 2, 3, 5, 7, 9], target = 6 输出: 0
这道题最简单的做法自然是正常从头遍历数个数:
func countTarget(scores []int, target int) int {
result := 0
for _, num := range scores {
if num == target {
result++
} else if target < num {
break
}
}
return result
}
另一个思路就很神奇了,可以用二分法查找,当然二分法只等找到一个符合目标的值,我们尽量让这个值取到最左边的边界,然后循环向右找右边界。
func countTarget(scores []int, target int) int {
left, right := 0, len(scores)-1
for left < right {
mid := (left + right) / 2
if scores[mid] <= target {
left = mid + 1
} else {
right = mid - 1
}
}
result := 0
for ; right >= 0 && scores[right] >= target; right-- {
if scores[right] == target {
result++
}
}
return result
}