# 454.四数相加||
- 链接:代码随想录
- 第一想法:不太清楚怎么做
- 看完代码随想录的想法:
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
"""
ab_dict = {}
for i in nums1:
for j in nums2:
ab_dict[i+j] = ab_dict.get(i+j,0) + 1
count = 0
for k in nums3:
for j in nums4:
if 0-(k+j) in list(ab_dict.keys()):
count += ab_dict[0-(k+j)]
return count
# 383.赎金信
- 链接:代码随想录
- 第一想法:
先遍历magzine,用dict形式 char为key count为value
再遍历ransomNote,如果char不在magzine dict的key里面,return false;
如果ransomNote要的个数多余magzine dictdevalue,return false;
其余的 return true
def canConstruct(self, ransomNote, magazine):
"""
:type ransomNote: str
:type magazine: str
:rtype: bool
"""
magazine_dict = {}
for char in magazine:
magazine_dict[char] = magazine_dict.get(char,0) + 1
for char in ransomNote:
if char not in list(magazine_dict.keys()):
return False
magazine_dict[char] -= 1
if magazine_dict[char] < 0:
return False
return True
- 看完代码随想录的想法:是一个做法
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
arr = [0] * 26
for x in magazine: # 记录 magazine里各个字符出现次数
arr[ord(x) - ord('a')] += 1
for x in ransomNote: # 在arr里对应的字符个数做--操作
if arr[ord(x) - ord('a')] == 0: # 如果没有出现过直接返回
return False
else:
arr[ord(x) - ord('a')] -= 1
return True
# 15.三数之和
- 链接:https://programmercarl.com/0015.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.html#%E5%93%88%E5%B8%8C%E8%A7%A3%E6%B3%95- 第一想法:感觉类似于454题,但是没想出来
- 看完代码随想录的想法:
对于a,b,c的去重还是有点迷糊
class Solution:
def threeSum(self, nums):
ans = []
n = len(nums)
nums.sort()
# 找出a + b + c = 0
# a = nums[i], b = nums[left], c = nums[right]
for i in range(n):
left = i + 1
right = n - 1
# 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了
if nums[i] > 0:
break
if i >= 1 and nums[i] == nums[i - 1]: # 去重a
continue
while left < right:
total = nums[i] + nums[left] + nums[right]
if total > 0:
right -= 1
elif total < 0:
left += 1
else:
ans.append([nums[i], nums[left], nums[right]])
# 去重逻辑应该放在找到一个三元组之后,对b 和 c去重
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 ans
# 18.四数之和
- 第一想法:
类似15题
- 看完代码随想录的想法:
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
n = len(nums)
res = []
for i in range(n):
if i > 0 and nums[i] == nums[i - 1]: continue # 对nums[i]去重
for k in range(i+1, n):
if k > i + 1 and nums[k] == nums[k-1]: continue # 对nums[k]去重
p = k + 1
q = n - 1
while p < q:
if nums[i] + nums[k] + nums[p] + nums[q] > target: q -= 1
elif nums[i] + nums[k] + nums[p] + nums[q] < target: p += 1
else:
res.append([nums[i], nums[k], nums[p], nums[q]])
# 对nums[p]和nums[q]去重
while p < q and nums[p] == nums[p + 1]: p += 1
while p < q and nums[q] == nums[q - 1]: q -= 1
p += 1
q -= 1
return res