四数相加
class Solution(object):
def fourSumCount(self, nums1, nums2, nums3, nums4):
"""
:type nums1: List[int]
:type nums2: List[int]
:type nums3: List[int]
:type nums4: List[int]
:rtype: int
"""
dict = {}
for i in nums1:
for j in nums2:
if i+j in dict:
dict[i+j] += 1
else:
dict[i+j] = 1
count = 0
for i in nums3:
for j in nums4:
if -i-j in dict:
count += dict[-i-j]
return count
赎金信
class Solution(object):
def canConstruct(self, ransomNote, magazine):
"""
:type ransomNote: str
:type magazine: str
:rtype: bool
"""
num1 = [0]*26
num2 = [0]*26
for i in ransomNote:
num = ord(i)-ord('a')
num1[num] += 1
for j in magazine:
num = ord(j)-ord('a')
num2[num] += 1
for i in range(26):
if num1[i] > num2[i]:
return False
return True
三数之和
双指针思想
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
lens = len(nums)
nums.sort()
for i in range(lens):
if nums[i]>0:
return res
if i>0 and nums[i] ==nums[i-1]:
continue
left = i+1
right = lens -1
while left <right:
num = nums[i]+nums[left] +nums[right]
if num<0:
left += 1
elif num >0 :
right -= 1
else:
res.append([nums[i],nums[left],nums[right]])
while left<right and nums[left] == nums[left+1]:
left += 1
while left <right and nums[right - 1] ==nums[right]:
right -= 1
left += 1
right -= 1
return res
四数之和
还是使用双指针
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
n = len(nums)
result = []
for i in range(n):
if nums[i] > target and nums[i] > 0 and target > 0:# 剪枝(可省)
break
if i > 0 and nums[i] == nums[i-1]:# 去重
continue
for j in range(i+1, n):
if nums[i] + nums[j] > target and target > 0: #剪枝(可省)
break
if j > i+1 and nums[j] == nums[j-1]: # 去重
continue
left, right = j+1, n-1
while left < right:
s = nums[i] + nums[j] + nums[left] + nums[right]
if s == target:
result.append([nums[i], nums[j], nums[left], nums[right]])
while left < right and nums[left] == nums[left+1]:
left += 1
while left < right and nums[right] == nums[right-1]:
right -= 1
left += 1
right -= 1
elif s < target:
left += 1
else:
right -= 1
return result