两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
如果数组已经排序,那么可以使用双指针思想。
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:nums.sort()left, right = 0, len(nums) - 1while left < right:match = nums[left] + nums[right]if match == target:return [left, right]elif match > target:right -= 1else:left += 1return [-1, -1] #没有答案,返回[-1, -1]
没有排序,使用哈希表思想
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:num_dict = {}for idx, num in enumerate(nums):if target - num not in num_dict:num_dict[num] = idxelse:return [idx, num_dict[target-num]]
三数之和
https://leetcode-cn.com/problems/3sum/
排序 + 三指针
class Solution:def threeSum(self, nums: [int]) -> [[int]]:nums.sort()res, k = [], 0for k in range(len(nums) - 2):if nums[k] > 0: break # 1. because of j > i > k.if k > 0 and nums[k] == nums[k - 1]: continue # 2. skip the same `nums[k]`.i, j = k + 1, len(nums) - 1while i < j: # 3. double pointers = nums[k] + nums[i] + nums[j]if s < 0:i += 1while i < j and nums[i] == nums[i - 1]: i += 1elif s > 0:j -= 1while i < j and nums[j] == nums[j + 1]: j -= 1else:res.append([nums[k], nums[i], nums[j]])i += 1j -= 1while i < j and nums[i] == nums[i - 1]: i += 1while i < j and nums[j] == nums[j + 1]: j -= 1return res
