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

查找升序整数数组中目标值的首尾索引问题求助

问题分析与修复方案

嘿,我一眼就发现你代码里的问题啦!

问题根源

你第一个for循环里的else块是和if语句绑定的,而不是和for循环绑定的。这就导致了一个致命逻辑错误:只要第一个元素不等于目标值,程序就会直接返回[-1,-1],根本不会继续检查列表后面的元素。

拿你的测试用例来说,列表第一个元素是3,不等于目标值5,代码立刻触发return [-1,-1],直接终止了程序,自然找不到后面存在的5了。

修复后的代码

我们需要调整逻辑:只有当整个第一个循环结束后,确认完全找不到目标值时,才返回[-1,-1]。下面是修正后的代码:

nums = [3,4,5,5,5,6,7,8,9]
target = 5
class Solution:
    def searchRange(self,nums, target):
        left_index = -1
        # 遍历寻找左边界
        for i in range(len(nums)):
            if nums[i] == target:
                left_index = i
                break
        # 如果左边界未找到,直接返回[-1,-1]
        if left_index == -1:
            return [-1,-1]
        # 反向遍历寻找右边界
        right_index = -1
        for j in range(len(nums)-1,-1,-1):
            if nums[j] == target:
                right_index = j
                break
        return [left_index, right_index]
x = Solution()
print(x.searchRange(nums,5))

运行这段代码,就能得到你期望的输出[2,4]啦。

进阶优化:二分查找

因为你的列表是升序排列的,用线性遍历虽然简单,但在列表元素很多时效率较低。更高效的方式是用二分查找来定位左右边界,时间复杂度可以降到O(log n):

class Solution:
    def searchRange(self, nums, target):
        # 寻找左边界的辅助函数
        def find_left():
            left, right = 0, len(nums)-1
            res = -1
            while left <= right:
                mid = (left + right) // 2
                if nums[mid] == target:
                    res = mid
                    right = mid - 1  # 找到匹配后继续往左探索更早的位置
                elif nums[mid] < target:
                    left = mid + 1
                else:
                    right = mid - 1
            return res
        
        # 寻找右边界的辅助函数
        def find_right():
            left, right = 0, len(nums)-1
            res = -1
            while left <= right:
                mid = (left + right) // 2
                if nums[mid] == target:
                    res = mid
                    left = mid + 1  # 找到匹配后继续往右探索更晚的位置
                elif nums[mid] < target:
                    left = mid + 1
                else:
                    right = mid - 1
            return res
        
        left_pos = find_left()
        # 左边界不存在的话,直接返回[-1,-1]
        if left_pos == -1:
            return [-1,-1]
        right_pos = find_right()
        return [left_pos, right_pos]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:17:03