文档讲解:代码随想录
视频讲解:454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
思路:
454.四数相加II
看了任务提示,依然没有思路,感觉思维被昨天的“两数之和”禁锢住了。
看了视频讲解,思路很清晰了。但仍出现报错,具体见困难一节,现已解决。
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
records = dict() # 为数组1和2之和创建一个字典,key表示二者之和,value表示该和出现的次数
count = 0 # 计算符合规则元组的个数
# 将字典填充
for num1 in nums1:
for num2 in nums2:
sum1 = num1 + num2
if sum1 in records.keys():
records[sum1] += 1
else:
records[sum1] = 1
# 查找 目标值 是否出现在字典里,并返回出现了多少次
for num3 in nums3:
for num4 in nums4:
target = 0 -(num3 + num4)
if target in records.keys():
count += records.get(target)
return count
383. 赎金信
思路清晰,可以自己写出来。
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
records = dict()
# 将mag的字母及其出现次数,分别作为key和value存入records字典中
for mag in magazine:
if mag in records.keys():
records[mag] += 1
else:
records[mag] = 1
# 遍历ransomNote中的元素,看是否出现在records字典中
for ran in ransomNote:
if ran in records.keys():
records[ran] -= 1
else:
records[ran] = -1
# 判断条件:records字典中的值小于0,代表ransomNote使用了magzine中未曾出现的值
for record_val in records.values():
if record_val < 0:
return False
return True
15. 三数之和
先看视频讲解,
一定要先对数组元素进行排序,去重也是难点!!!
我的代码,但是有问题,无法通过第一个测试用例。
class Solution:
def threeSum(self, nums: List[int]) -> 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 (left < right):
if (nums[i] + nums[left] + nums[right] > 0):
right -= 1
elif(nums[i] + nums[left] + nums[right] < 0):
left += 1
elif(nums[i] + nums[left] + nums[right] == 0):
result.append([nums[i], nums[left], nums[right]])
while left < right and nums[right] == nums[right - 1]:
right -= 1
while left < right and nums[left] == nums[left + 1]:
left += 1
right -= 1
left += 1
return result
代码随想录中的代码
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
result = []
nums.sort()
for i in range(len(nums)):
# 如果第一个元素已经大于0,不需要进一步检查
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:
sum_ = nums[i] + nums[left] + nums[right]
if sum_ < 0:
left += 1
elif sum_ > 0:
right -= 1
else:
result.append([nums[i], nums[left], nums[right]])
# 跳过相同的元素以避免重复
while right > left and nums[right] == nums[right - 1]:
right -= 1
while right > left and nums[left] == nums[left + 1]:
left += 1
right -= 1
left += 1
return result
18. 四数之和
看视频讲解,但是思路还是不太清晰。之后有空还是得再补一下。
困难:
454.四数相加II
报错:KeyError: -1 records[sum1] += 1
# 将字典填充
for num1 in nums1:
for num2 in nums2:
sum1 = num1 + num2
records[sum1] += 1
要解决 KeyError 异常,可以在访问之前检查字典中是否存在该键。keys() 方法返回字典中的键列表。在访问某个键的值之前,如果你不确定该键是否存在,建议你检查该键是否存在于此列表中。
修改后,代码如下:
# 将字典填充
for num1 in nums1:
for num2 in nums2:
sum1 = num1 + num2
if sum1 in records.keys():
records[sum1] += 1
else:
records[sum1] = 1
383. 赎金信
吸取了上一题中KeyError的错误,但是对于Indentation(空格)理解的不太好。
15. 三数之和
去重的思路,有点点难。还有就是第一个测试用例无法通过,奇怪?
18. 四数之和
剪枝思想和去重思想还是需要理解理解。
今日收获:
今天前两道题掌握的不错,后两道题涉及到的去重、剪枝还是有一点难度。今天时间有限,有空还需要再好好思考一下。
学习时间:
- 早上7 点30—11点