文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、leetcode 454.四数相加II
1.题目链接:
2.独立做题问题总结
3.解法总结:
- 分组+哈希表
两两一组,将第一组枚举和的可能性并统计不同和的个数存进哈希表
对另一组的和进行判断,如果在hashmap中,则res加上该和的可能个数。
from collections import defaultdict
dic = defaultdict(int)
res = 0
for i in range(len(nums1)):
for j in range(len(nums2)):
cur = nums1[i] + nums2[j]
dic[cur] += 1
for i in range(len(nums3)):
for j in range(len(nums4)):
cur = - nums3[i] - nums4[j]
if cur in dic:
res += dic[cur]
return res
二、leetcode 383. 赎金信
1.题目链接:
2.独立做题问题总结
一开始做的时候用的hashmap
3.解法总结:
- 哈希表
from collections import defaultdict
dic = defaultdict(int)
for i in magazine:
dic[i] += 1
for j in ransomNote:
if j not in dic:
return False
else:
dic[j] -= 1
if dic[j] < 0:
return False
return True
- python技巧
!! 将list里的元素统计:collections.Counter(ransomNote)
c1 = collections.Counter(ransomNote)
c2 = collections.Counter(magazine)
x = c1 - c2
#x只保留值大于0的符号,当c1里面的符号个数小于c2时,不会被保留
#所以x只保留下了,magazine不能表达的
if(len(x)==0):
return True
else:
return False
三、leetcode 15. 三数之和
1.题目链接:
2.独立做题问题总结
3.解法总结:
双指针法
第一步对nums排序
先固定第一位i,然后采用l,r双指针对i以后元素进行选择,当i+l+r元素和== 0时,res储存,当小于0时,l++,当大于0时,r–。
减枝:1. 当i元素大于0时,直接返回res
去重:
§1. 第一个元素去重:i和i-1相等且i>0时,continue
§前提: i+l+r元素和== 0
§2. 第二个元素去重:当l+1和l相等时,l= l+1
§3. 第三个元素去重:当r-1和r相等时,r=r-1
while (right > left && nums[right] == nums[right - 1]) right–;
while (right > left && nums[left] == nums[left + 1]) left++;
nums.sort()
res = []
for i in range(len(nums)):
if nums[i] > 0:
return res
if i > 0 and nums[i] == nums[i - 1]:#去重
continue
l = i + 1
r = len(nums) - 1
while(l < r):
if nums[i] + nums[l] + nums[r] > 0:
r -= 1
elif nums[i] + nums[l] + nums[r] < 0:
l += 1
else:
res.append([nums[i], nums[l], nums[r]])
while(r > l and nums[r] == nums[r - 1]):
r -= 1
while(r > l and nums[l] == nums[l + 1]):
l += 1
r -= 1
l += 1
#
return res
四、leetcode 18. 四数之和
1.题目链接:
2.独立做题问题总结
3.解法总结:
- 加一重for循环判定第二个元素
nums.sort()
res = []
for i in range(len(nums)):
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,len(nums)):
# if (nums[i] + nums[j]) > target and (nums[i] + nums[j]) >= 0:
# return res
if j > i + 1 and nums[j] == nums[j - 1]:#去重
continue
l = j + 1
r = len(nums) - 1
while(l < r):
if nums[l] + nums[r] + nums[i] + nums[j] < target:
l += 1
elif nums[l] + nums[r] + nums[i] + nums[j] > target:
r -= 1
else:
if [nums[i],nums[j],nums[l],nums[r]] not in res:
res.append([nums[i],nums[j],nums[l],nums[r]])
print(i,j,l,r)
while(l < r and nums[r] == nums[r - 1]):
r -= 1
while(l < r and nums[l] == nums[l + 1]):
l += 1
l += 1
r -= 1
return res