454. 四数相加 II
本题的思路相对而言比较简单,首先先存储ab的和出现的频率,再统计cd的和有没有符合sum(a,b)+sum(c,d) =0,最终得到结果
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
absum = {}
for i in range(len(nums1)):
for j in range(len(nums2)):
resab = nums1[i]+nums2[j]
if resab in absum:
absum[resab] +=1 #统计ab相加和出现的次数
else:
absum[resab] = 1
count =0
for i in range(len(nums3)):
for j in range(len(nums4)):
rescd = nums3[i] + nums4[j]
if 0-rescd in absum:
count += absum[0-rescd]
return count
383. 赎金信
一些同学可能想,用数组干啥,都用map完事了,其实在本题的情况下,使用map的空间消耗要比数组大一些的,因为map要维护红黑树或者哈希表,而且还要做哈希函数,是费时的!数据量大的话就能体现出来差别了。 所以数组更加简单直接有效!
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
res = [0]*26
for i in ransomNote:
res[ord(i)-ord('a')] += 1
for i in magazine:
res[ord(i)-ord('a')] -= 1
for i in range(len(res)):
if res[i] >0:
return False
return True
15. 三数之和
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = []
nums.sort() # 要先进行排序
for i in range(len(nums)):
# 如果第一个元素已经大于0,不需要进一步检查
if nums[i] >0:
return res
if i>0 and nums[i] == nums[i-1]:
continue
left = i+1
right = len(nums)-1
while left<right:
sum_all = nums[i] + nums[left] + nums[right]
if sum_all >0:
right-=1
if sum_all <0:
left +=1
if sum_all ==0:
res.append([nums[i], nums[left], nums[right]])
while left<len(nums)-1 and nums[left]==nums[left+1]:
left += 1
while right>i+1 and nums[right]==nums[right-1]:
right -= 1
left += 1
right -= 1
return res
18. 四数之和
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
res = []
nums.sort() # 要先进行排序
for k in range(len(nums)):
if nums[k]>target and nums[k]>0 and target>0: # 剪枝
break
if k>0 and nums[k] == nums[k-1]: #去重
continue
for i in range(k+1, len(nums)):
# 如果第一个元素已经大于0,不需要进一步检查
if nums[i]+nums[k] >target and target>0: # 剪枝
break
if i>k+1 and nums[i] == nums[i-1]: #去重
continue
left = i+1
right = len(nums)-1
while left<right:
sum_all = nums[k] + nums[i] + nums[left] + nums[right]
if sum_all >target:
right-=1
if sum_all <target:
left +=1
if sum_all ==target:
res.append([nums[k], nums[i], nums[left], nums[right]])
while left<len(nums)-1 and nums[left]==nums[left+1]:
left += 1
while right>i+1 and nums[right]==nums[right-1]:
right -= 1
left += 1
right -= 1
return res