代码随想录算法训练营第七天
383赎金信
https://leetcode.cn/problems/ransom-note/submissions/537782865/
383赎金信代码随想录
https://programmercarl.com/0383.赎金信.html#思路
四数之和2
https://leetcode.cn/problems/4sum-ii/
四数之和2代码随想录
https://programmercarl.com/0454.四数相加II.html#算法公开课
三数之和
https://leetcode.cn/problems/3sum/description/
三数之和代码随想录
https://programmercarl.com/0015.三数之和.html#思路
四数之和
https://leetcode.cn/problems/4sum/description/
四数之和代码随想录
https://programmercarl.com/0018.四数之和.html#算法公开课
383赎金信
题目
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
题解
和前面计数一样
四数之和2
题目
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
- 0 <= i, j, k, l < n
- nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
题解
- 不要求题解中不出现重复数字
- 从不同数组中挑数字 不需要考虑重复问题
- 更简单
- 1个哈希表 分别对2组数组计算即可
题解代码
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
hash_table ={}
for num_1 in range(len(nums1)):
for num_2 in range(len(nums2)):
num = nums1[num_1]+nums2[num_2]
hash_table[num] = hash_table.get(num,0)+1
res = 0
for num_3 in range(len(nums3)):
for num_4 in range(len(nums4)):
num = 0-(nums3[num_3]+nums4[num_4])
if num in hash_table:
res = res + hash_table[num]
return res
三数之和 + 四数之和
三数之和题目
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
四数之和题目
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
题解(同类):
- 首先排序
- 固定指针,剩下由双指针计算两数之和;
- 一开始使用二分法 这里不能用二分法 因为不确定一定存在;
- 注意剪枝
- 个数剪枝:不满足个数 直接返回
- 遍历函数剪枝(target不确定时,需要确定数字正负):超过target返回->因为是按大小排序的
- 指针剪枝:和前面相同直接跳过
题解代码
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
if len(nums)<4:
return []
##首先排除无结果的输入
nums = sorted(nums)
res = []
##初始化
##第一个遍历循环
n = len(nums)
for i in range(n):
if nums[i]>target and nums[i]>0:
return res
if i>0 and nums[i]==nums[i-1]:
continue
##第二个遍历循环
for j in range(i+1,n):
if nums[i]+nums[j]>target and nums[j]>0:
break
if j>i+1 and nums[j]==nums[j-1]:
continue
l = j+1
r = n-1
##指针寻找target
while l<r:
if nums[i]+nums[j]+nums[l]+nums[r]<target:
l = l+1
elif nums[i]+nums[j]+nums[l]+nums[r]>target:
r = r-1
else:
res.append([nums[i],nums[j],nums[l],nums[r]])
while 0<l<n-1 and nums[l+1]==nums[l]:
l = l+1
while l<r<n and nums[r-1]==nums[r]:
r = r-1
##2个指针固定以后,可能有n个答案
l = l+1
r = r-1
return res
标签:四数,target,nums,int,三数,随想录,num,https
From: https://www.cnblogs.com/P201821440041/p/18237004