两数之和问题是LeetCode上的一道经典算法题,也是面试中常见的问题。题目要求在一个整数数组中找到两个数,使它们的和等于一个特定的目标值,并返回这两个数的下标。
以下是多种解法:
- 暴力法: 最简单的方法是使用两个嵌套循环遍历数组中的所有可能组合,找到满足目标和的两个数。这种方法的时间复杂度为O(n^2)。
def twoSum(nums, target): n = len(nums) for i in range(n): for j in range(i+1, n): if nums[i] + nums[j] == target: return [i, j] return None
- 排序 + 双指针法: 先对数组进行排序,然后使用双指针从数组的两端开始向中间靠拢,根据和与目标值的大小关系来调整指针的位置。这种方法的时间复杂度为O(nlogn),其中n是数组的长度。
def twoSum(nums, target): sorted_nums = sorted(nums) left, right = 0, len(nums)-1 while left < right: curr_sum = sorted_nums[left] + sorted_nums[right] if curr_sum == target: break elif curr_sum < target: left += 1 else: right -= 1 if left < right: # 在原数组中查找对应的下标 index1 = nums.index(sorted_nums[left]) index2 = nums.index(sorted_nums[right], index1+1) return [index1, index2] return None
- 使用集合(哈希表): 这种方法类似于使用字典的解法,但是不需要存储每个数字对应的下标,只需要存储数字本身。遍历数组时,判断目标值与当前数字的差值是否在集合中,如果在,则找到了满足条件的两个数。
def twoSum(nums, target): num_set = set() for num in nums: complement = target - num if complement in num_set: index1 = nums.index(complement) index2 = nums.index(num, index1+1) return [index1, index2] num_set.add(num) return None