知识点
- 解决求和问题,需要结合排序+双指针
454. 4Sum II
- 四数相加求和,和为0
- 四个数组各取一个数,a+b=0-(c+d)如果成立,则加上a和b相应的排列数量
- 从左到右依次遍历四个list
- 最终的和即为结果
class Solution:
def fourSumCount(self, A, B, C, D):
cnt = 0
m = collections.defaultdict(int)
for a in A:
for b in B:
m[a + b] += 1
print(m)
for c in C:
for d in D:
cnt += m[0 - (c + d)]
return cnt
383. Ransom Note
- 方法:
- 使用字典的时候可以使用.get(x, 0)+1的方法初始化和添加元素
- 使用.items()对元素进行遍历
class Solution:
def canConstruct(self, ransomNote, magazine):
target = {}
for i in magazine:
target[i] = target.get(i, 0) + 1
c = {}
for i in ransomNote:
c[i] = c.get(i, 0) + 1
for i,j in c.items():
if i in target.keys():
if j > target[i]:
return False
elif i not in target.keys():
return False
return True
15. 3Sum
- 求和问题首先要对列表进行从小到大的排序,然后使用双指针在指定区域内相向运动
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
nums.sort()
for i in range(len(nums)):
if nums[i] > 0:
break
if i == 0 or nums[i - 1] != nums[i]:
self.twoSumII(nums, i, res)
return res
def twoSumII(self, nums, i, res):
lo, hi = i + 1, len(nums) - 1
while (lo < hi):
sum = nums[i] + nums[lo] + nums[hi]
if sum < 0:
lo += 1
elif sum > 0:
hi -= 1
else:
res.append([nums[i], nums[lo], nums[hi]])
lo += 1
hi -= 1
while lo < hi and nums[lo] == nums[lo - 1]:
lo += 1
18. 4Sum
class Solution(object):
def threeSum(self, nums, target):
results = []
nums.sort()
for i in range(len(nums)-2):
l = i + 1; r = len(nums) - 1
t = target - nums[i]
if i == 0 or nums[i] != nums[i-1]:
while l < r:
s = nums[l] + nums[r]
if s == t:
results.append([nums[i], nums[l], nums[r]])
while l < r and nums[l] == nums[l+1]: l += 1
while l < r and nums[r] == nums[r-1]: r -= 1
l += 1; r -=1
elif s < t:
l += 1
else:
r -= 1
return results
def fourSum(self, nums, target):
results = []
nums.sort()
for i in range(len(nums)-3):
if i == 0 or nums[i] != nums[i-1]:
threeResult = self.threeSum(nums[i+1:], target-nums[i])
for item in threeResult:
results.append([nums[i]] + item)
return results