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

为何出现IndexError: list assignment index out of range?求数组配对问题修正

问题原因

你触发的IndexError是因为删除数组元素后,原right索引已经超出了新数组的长度范围。举个具体场景:
原数组是[1,2,3,4],left=0,right=3,执行del nums[left]后,数组变成[2,3,4],此时数组长度为3,最大索引是2,但你的right变量还是3,再执行del nums[right]自然会访问不存在的索引,触发错误。

另外,你在删除元素后对left和right的调整逻辑也完全错误:删除两个元素后数组长度减少2,此时left不需要递增(下一个目标元素会自动移到当前left位置),right也不该递增,反而需要递减来匹配新的数组长度。

修复方案1:简化双指针逻辑(无需修改原数组)

题目只要求返回操作次数,不需要修改输入数组,所以可以直接通过指针移动计数,完全规避数组修改的问题:

class Solution(object):
    def maxOperations(self, nums, k):
        count = 0
        nums.sort()
        left = 0
        right = len(nums) - 1
        
        while left < right:
            curr_sum = nums[left] + nums[right]
            if curr_sum == k:
                count += 1
                left += 1
                right -= 1
            elif curr_sum < k:
                left += 1
            else:
                right -= 1
        return count

逻辑很直观:排序后用左右指针向中间靠拢,找到和为k的数对就计数,同时移动两个指针;和太小就左移左指针,和太大就右移右指针。

修复方案2:哈希表优化(时间复杂度O(n))

如果处理大规模数组,排序的O(n log n)效率不够,可以用哈希表统计数字出现次数,实现线性时间复杂度:

class Solution(object):
    def maxOperations(self, nums, k):
        count_map = {}
        operations = 0
        for num in nums:
            complement = k - num
            if count_map.get(complement, 0) > 0:
                operations += 1
                count_map[complement] -= 1
            else:
                count_map[num] = count_map.get(num, 0) + 1
        return operations

思路:遍历每个数字,检查它的补数(k - num)是否在哈希表中有剩余次数:

  • 有剩余就执行一次操作,补数计数减1
  • 没有剩余就把当前数字的计数加1

这种方法不需要排序,也完全不会涉及数组元素删除,从根源上避免了索引问题。

原代码的核心问题总结
  1. 删除nums[left]后,原right位置的元素索引变为right-1,此时del nums[right]必然越界
  2. 删除元素后对left和right的调整逻辑完全错误,不符合数组长度变化的规律,会导致后续指针位置混乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:05:30