TwoSum, 在一个列表中,找到两个数的index,使得这两个数加起来等于另一个数。
我用的是一个辅助字典,即空间换时间。字典里存储每个数的互补数(complementary = target - value)
class Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ map_table = {} for i, val in enumerate(nums): complementary = target - val if map_table.get(complementary) is not None: return [i, map_table.get(complementary)] map_table[val] = i
ThreeSum, 在一个列表中找到所有的三元组,使得三元组中这3个数字加起来等于0。要求是三元组中不能有重复的。
这个就是TwoSum的升级版。对于每个数a,在它后面的数组中,寻找和为a的两个数的组合。
但是直接这样做通过不了OJ,在一些特定的输入下会超时。比如输入为[0, 0, 0,, ...........0, 0],输出应该是[[0, 0, 0]]。
所以可以在原始输入中做些手脚。因为求的是三元组,所以可以删掉原数组中重复项(重复3次以上的数字删掉)。
这应该不是常规解法,但是OJ能过。
class Solution(object): def threeSum(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ result = set() reduced_list = self.remove_duplicate_3(nums) print(reduced_list) for i in range(len(reduced_list)): sum_value = -reduced_list[i] two_values = self.twoSum(reduced_list[i+1:], sum_value) if two_values != []: for values in two_values: values += [reduced_list[i]] result.add(tuple(sorted(values))) return [list(i) for i in result] def twoSum(self, nums, target): map_table = {} result_list = [] for i, val in enumerate(nums): complementary = target - val if map_table.get(complementary) is not None: result_list.append([val, complementary]) map_table[val] = i return result_list def remove_duplicate_3(self, nums): result = {} reduce_list = [] for i in nums: if result.get(i) is None: result[i] = 1 reduce_list.append(i) else: result[i] += 1 if result[i] <= 3: reduce_list.append(i) return reduce_list