You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

有序数组数字出现次数统计代码:条件判断逻辑及代码问题问询

有序数组目标值出现次数的二分查找代码问题解析

原代码

class Solution(object):
    def search(self, nums, target):
        # find the right bound
        i, j = 0, len(nums) - 1
        while i <= j:
            m = (i + j) // 2
            if nums[m] < target:
                i = m + 1
            elif nums[m] > target:
                j = m - 1
            else:
                i = m + 1 
        right = i
        if j == len(nums) or nums[j] != target:
            return 0

        # find the left bound
        i, j = 0, len(nums) - 1
        while i <= j:
            m = (i + j) // 2
            if nums[m] < target:
                i = m + 1
            elif nums[m] > target:
                j = m - 1
            else:
                j = m - 1 
        left = j
        if i == len(nums) or nums[i] != target:
            return 0
        return right - left - 1

问题解答

1. 为何if j == len(nums) or nums[j] != target: return 0在j=-1时可执行,目标次数为0时却无法触发?

  • j=-1时可执行的原因:当target比数组所有元素都小时,循环中每次都会触发nums[m] > target,j不断减1,最终j=-1、i=0。此时j == len(nums)不成立(数组长度≥0,j=-1),但Python允许负索引,nums[j]会取数组最后一个元素,而该元素必然大于target,因此触发nums[j] != target,执行return 0。
  • 目标次数为0却无法触发的场景:最典型的是空数组情况——当nums为空时,len(nums)=0,j初始值为-1,循环直接跳过。执行判断时,j == len(nums)不成立,接着访问nums[j]即nums[-1],空数组的负索引会直接抛出IndexError,根本走不到return 0的逻辑。

2. 代码整体存在的其他问题

  • 空数组访问越界:如上述场景,空数组时会直接抛出索引错误,无法正常返回0。
  • 冗余判断:找右边界后已经完成了target是否存在的校验,若target不存在会直接return 0,根本不会执行到找左边界的代码。因此找左边界后的if i == len(nums) or nums[i] != target: return 0完全多余,属于重复判断。
  • 代码重复:找左右边界的逻辑高度重复,可以合并成一个通用的边界查找函数,减少冗余代码,提升可维护性。
  • 逻辑严谨性不足:当target存在时,找左边界后的判断完全无效,因为此时i必然指向第一个target的位置,nums[i]一定等于target,i也不可能等于数组长度。

内容的提问来源于stack exchange,提问作者user22007579

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 19:39:57