如何在Dart/Flutter中获取列表中和为指定值的元素组合
列表两数之和匹配目标值的实现方法
针对从列表[1,2,3,4,5]中找出所有和为5的两两元素组合(结果为[[4,1],[3,2]])的需求,常用两种高效方法:
1. 哈希表(字典)法
思路
遍历列表时,用字典记录已经处理过的元素。对当前元素,计算目标值 - 当前元素的差值,如果差值存在于字典中,说明之前遍历过的某个元素能和当前元素组成符合要求的组合,直接加入结果列表。遍历完成后即可得到所有有效组合。
代码示例(Python)
def find_two_sum_pairs(nums, target): seen = {} result = [] for num in nums: complement = target - num if complement in seen: result.append([num, complement]) seen[num] = True return result # 测试 nums = [1,2,3,4,5] target = 5 print(find_two_sum_pairs(nums, target)) # 输出: [[4,1],[3,2]]
2. 双指针法
思路
先对列表排序,再用左右两个指针分别指向列表首尾:
- 若两指针元素之和等于目标值,记录组合(按需求调整顺序),同时移动两个指针;
- 若和小于目标值,左指针右移以增大总和;
- 若和大于目标值,右指针左移以减小总和。
直到左右指针相遇,即可得到所有有效组合。
代码示例(Python)
def find_two_sum_pairs(nums, target): nums_sorted = sorted(nums) left, right = 0, len(nums_sorted) - 1 result = [] while left < right: current_sum = nums_sorted[left] + nums_sorted[right] if current_sum == target: result.append([nums_sorted[right], nums_sorted[left]]) left += 1 right -= 1 elif current_sum < target: left += 1 else: right -= 1 return result # 测试 nums = [1,2,3,4,5] target = 5 print(find_two_sum_pairs(nums, target)) # 输出: [[4,1],[3,2]]
方法对比
- 哈希表法:时间复杂度
O(n),空间复杂度O(n),适合对时间要求较高的场景; - 双指针法:时间复杂度主要由排序决定,为
O(nlogn),空间复杂度O(1)(若忽略排序的额外空间),适合内存有限的场景。
内容的提问来源于stack exchange,提问作者Swati Prajapati
相关产品推荐
相关产品推荐

