为何出现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
这种方法不需要排序,也完全不会涉及数组元素删除,从根源上避免了索引问题。
原代码的核心问题总结
- 删除
nums[left]后,原right位置的元素索引变为right-1,此时del nums[right]必然越界 - 删除元素后对
left和right的调整逻辑完全错误,不符合数组长度变化的规律,会导致后续指针位置混乱
内容的提问来源于stack exchange,提问作者vilnius19
相关产品推荐
相关产品推荐

