题目一
两个for循环,把四数之和转换为两数之和
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
"""
table={}
for i in nums1:
for j in nums2:
table[i+j]=table.get(i+j,0)+1
count=0
for i in nums3:
for j in nums4:
if -(i+j) in table:
count+=table[-(i+j)]
return count
题目二、三
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result=[]
nums.sort()
for i in range(len(nums)):
if nums[i]>0:
return result
if i>0 and nums[i]==nums[i-1]:
continue
left = i + 1
right = len(nums)-1
while right>left:
if nums[i]+nums[left]+nums[right]<0:
left+=1
elif nums[i]+nums[left]+nums[right]>0:
right-=1
else:
result.append([nums[i], 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
return result
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
nums.sort()
result=[]
for i in range(len(nums)):
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,len(nums)):
if nums[i]+nums[j]>target and nums[i]+nums[j]>0 and target>0:
break
if j>i+1 and nums[j]==nums[j-1]:
continue
left=j+1
right=len(nums)-1
while left<right:
_sum=nums[i]+nums[j]+nums[left]+nums[right]
if _sum<target:
left+=1
elif _sum>target:
right-=1
else:
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
return result
题目四
class Solution(object):
def canConstruct(self, ransomNote, magazine):
"""
:type ransomNote: str
:type magazine: str
:rtype: bool
"""
table=[0]*26
for i in magazine:
table[ord(i)-ord('a')]+=1
for j in ransomNote:
table[ord(j)-ord('a')]-=1
for n in table:
if n<0:
return False
return True