两数之和
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
如果数组已经排序,那么可以使用双指针思想。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums.sort()
left, right = 0, len(nums) - 1
while left < right:
match = nums[left] + nums[right]
if match == target:
return [left, right]
elif match > target:
right -= 1
else:
left += 1
return [-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] = idx
else:
return [idx, num_dict[target-num]]
三数之和
https://leetcode-cn.com/problems/3sum/
排序 + 三指针
class Solution:
def threeSum(self, nums: [int]) -> [[int]]:
nums.sort()
res, k = [], 0
for 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) - 1
while i < j: # 3. double pointer
s = nums[k] + nums[i] + nums[j]
if s < 0:
i += 1
while i < j and nums[i] == nums[i - 1]: i += 1
elif s > 0:
j -= 1
while i < j and nums[j] == nums[j + 1]: j -= 1
else:
res.append([nums[k], nums[i], nums[j]])
i += 1
j -= 1
while i < j and nums[i] == nums[i - 1]: i += 1
while i < j and nums[j] == nums[j + 1]: j -= 1
return res