技术问询:完善Python代码实现数组中和为指定值的数对索引求和
解决两数之和数对的索引求和问题
嘿,我来帮你把现有代码改成符合需求的版本!你当前的代码能找到符合条件的数对,但没法拿到它们的索引并求和——这事儿不难调整,咱们一步步来。
首先,核心问题是:我们需要追踪元素的索引,而不是只拿元素本身。你的代码用itertools.combinations(arr, 2)生成的是元素组合,丢了索引信息,所以得换个思路,先生成索引的组合,再对应到元素上判断。
修改后的完整代码
from itertools import combinations def pairwise(arr, n): index_sum = 0 # 生成数组所有索引的两两组合(避免重复数对,比如(1,3)和(3,1)视为同一个) for idx_pair in combinations(range(len(arr)), 2): idx1, idx2 = idx_pair # 检查对应元素之和是否等于目标n if arr[idx1] + arr[idx2] == n: index_sum += idx1 + idx2 return index_sum # 测试示例 arr = [1, 4, 2, 3, 0, 5] n = 7 print(pairwise(arr, n)) # 输出:11
代码解释
- 用
combinations(range(len(arr)), 2)生成所有不重复的索引对:因为数对是无序的(比如(4,3)和(3,4)是同一个有效数对),组合刚好能避免重复计算,符合需求。 - 对每个索引对,取出对应元素判断和是否等于n,符合条件就把两个索引加到总和里。
- 最后返回累计的索引总和,完美匹配示例的输出结果。
额外小提示
如果你的数组很大,用combinations的时间复杂度是O(n²),可能有点慢。这种情况下可以用哈希表(字典)来优化到O(n)时间:
def pairwise(arr, n): index_sum = 0 num_index_map = {} for idx, num in enumerate(arr): complement = n - num if complement in num_index_map: # 把所有能和当前数配对的索引加进来 index_sum += sum(num_index_map[complement]) + idx * len(num_index_map[complement]) # 把当前数的索引存入字典(处理重复元素的情况) if num not in num_index_map: num_index_map[num] = [] num_index_map[num].append(idx) return index_sum
这个版本适合处理大数组,还能正确应对数组里有重复元素的情况~
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

