Day 7| 454.四数相加II 、383. 赎金信 、15. 三数之和 、18. 四数之和
1.Day2| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II2.Day 1 | 704. 二分查找、27. 移除元素3.Day3 | 203.移除链表元素 、707.设计链表 、 206.反转链表4.Day 4 | 24. 两两交换链表中的节点 、 19.删除链表的倒数第N个节点 、面试题 02.07. 链表相交 、142.环形链表II5.Day 6| 242.有效的字母异位词 、349. 两个数组的交集 、 202. 快乐数 、 1. 两数之和
6.Day 7| 454.四数相加II 、383. 赎金信 、15. 三数之和 、18. 四数之和
7.Day 8 | 344.反转字符串 、541. 反转字符串II 、151.翻转字符串里的单词8.Day 10| 232.用栈实现队列 、 225. 用队列实现栈9.Day 11 | 20. 有效的括号 、1047. 删除字符串中的所有相邻重复项 、150. 逆波兰表达式求值10.大厂面试高频题目——其他11.Day 13| 239. 滑动窗口最大值、 347.前 K 个高频元素12.Day14 | 二叉树递归遍历13.Day15 | 102. 二叉树的层序遍历 、226.翻转二叉树 101. 对称二叉树14.大厂面试高频题目-回溯15.Day16 | 104.二叉树的最大深度 、111.二叉树的最小深度 、222.完全二叉树的节点个数16.Day17| 110.平衡二叉树、 257. 二叉树的所有路径 、 404.左叶子之和17.大厂面试高频题——动态规划18.大厂面试高频题目——图论19.Day18 | 513. 找树左下角的值 | 112.路径总和、113.路径总和ii | 105.106.从中序与后(前)序遍历序列构造二叉树20.Day20 | 654.最大二叉树 、 617.合并二叉树 、 700.二叉搜索树中的搜索 98.验证二叉搜索树21.Day21 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先22.Day22 | 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点23.Day23 | 669. 修剪二叉搜索树 、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树24.Day24| 77. 组合 、216.组合总和III 、17.电话号码的字母组合25.Day 26| 39. 组合总和 、 40.组合总和II 、 131.分割回文串26.Day 27|93.复原IP地址、78.子集 、90.子集II27.Day 28 | 491.递增子序列 、46.全排列、 47.全排列 II28.Day 29 | 455.分发饼干、376. 摆动序列 、53. 最大子序和29.Day 30 | 122.买卖股票的最佳时机II、55. 跳跃游戏 、45.跳跃游戏II、 1005.K次取反后最大化的数组和30.Day 35| 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯31.Day 36 | 62.不同路径 、 63. 不同路径 II 、343. 整数拆分、96.不同的二叉搜索树32.Day 37 | 01背包问题 、416. 分割等和子集33.Day 38 | 1049. 最后一块石头的重量 II 、494. 目标和 、474.一和零34.Day 40 |完全背包 、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)35.Day 41 | 322. 零钱兑换 、 279.完全平方数、139.单词拆分36.大厂面试高频题——二分查找37.Day 42 | 198.打家劫舍 、213.打家劫舍II、337.打家劫舍III38.Day43 |121. 买卖股票的最佳时机 (只能买卖一次)、122.买卖股票的最佳时机II(可以买卖多次)、123.买卖股票的最佳时机III (最多买卖2次)39.Day 44 | 714.买卖股票的最佳时机含手续费 、309.最佳买卖股票时机含冷冻期40.Day 45 | 300.最长递增子序列 、674. 最长连续递增序列 、718. 最长重复子数组41.Day 47 | 1143.最长公共子序列 、 53. 最大子序和454.四数相加II
建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序执行效率,降低时间复杂度,当然使用哈希法 会提高空间复杂度,但一般来说我们都是舍空间 换时间, 工业开发也是这样。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.四数相加II.html
思考
4个独立的数组,可以用哈希解决。
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
sum_dic = {}
for i in nums1:
for j in nums2:
if i+j not in sum_dic:
sum_dic[i+j]=1
else:
sum_dic[i+j]+=1
res = 0
for i in nums3:
for j in nums4:
if -(i+j) in sum_dic:
res+=sum_dic[-i-j]
return res
383. 赎金信
建议:本题 和 242.有效的字母异位词 是一个思路 ,算是拓展题
题目链接/文章讲解:https://programmercarl.com/0383.赎金信.html
思考
很简单的一道题
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
char_map = [0] * 26
for c in magazine:
char_map[ord(c)-ord('a')]+=1
for c in ransomNote:
if char_map[ord(c)-ord('a')] <= 0:
return False
char_map[ord(c)-ord('a')]-=1
return True
15. 三数之和
建议:本题虽然和 两数之和 很像,也能用哈希法,但用哈希法会很麻烦,双指针法才是正解,可以先看视频理解一下 双指针法的思路,文章中讲解的,没问题 哈希法很麻烦。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0015.三数之和.html
思考
双指针的题目,二刷了,还是卡了一点时间,而且代码去重还没做好,需要剪枝。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
res=[]
for i in range(n-2):
if i > 0 and nums[i] == nums[i-1]:
continue
left = i+1
right = n-1
while left<right:
if nums[i] + nums[left] + nums[right] == 0:
res.append([nums[i] , nums[left] , nums[right]])
temp = nums[left]
left+=1
while nums[left] == temp and left<right:
left+=1
elif nums[i] + nums[left] + nums[right] < 0:
left+=1
else:
right-=1
return res
优化去重逻辑,bc都要去重。另外,要进行剪枝。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
res=[]
for i in range(n-2):
if nums[i] > 0:
return res
if i > 0 and nums[i] == nums[i-1]:
continue
left = i+1
right = n-1
while left<right:
if nums[i] + nums[left] + nums[right] == 0:
res.append([nums[i] , nums[left] , nums[right]])
while left<right and nums[left] == nums[left+1] :
left+=1
left+=1
while left<right and nums[right] == nums[right-1]:
right-=1
right-=1
elif nums[i] + nums[left] + nums[right] < 0:
left+=1
else:
right-=1
return res
18. 四数之和
建议: 要比较一下,本题和 454.四数相加II 的区别,为什么 454.四数相加II 会简单很多,这个想明白了,对本题理解就深刻了。 本题 思路整体和 三数之和一样的,都是双指针,但写的时候 有很多小细节,需要注意,建议先看视频。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0018.四数之和.html
思考
解法上和三数之和一样的,多了一层循环,先写一个去重版本的。
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
n = len(nums)
res = []
for i in range(n-3):
if i>0 and nums[i]==nums[i-1]:
continue
for j in range(i+1,n-2):
if j > i+1 and nums[j]==nums[j-1]:
continue
left = j+1
right = n-1
while left<right:
sum_ = nums[i]+nums[j]+nums[left]+nums[right]
if sum_ == target:
res.append([nums[i] ,nums[j], nums[left] , nums[right]])
while left<right and nums[left] == nums[left+1] :
left+=1
left+=1
while left<right and nums[right] == nums[right-1]:
right-=1
right-=1
elif sum_ < target:
left+=1
else:
right-=1
return res
剪枝优化版本,只有nums[i] > target and nums[i] >= 0 才可以
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
n = len(nums)
res = []
for i in range(n-3):
if i>0 and nums[i]==nums[i-1]:
continue
if nums[i] > target and nums[i] >= 0:
return res
for j in range(i+1,n-2):
if j > i+1 and nums[j]==nums[j-1]:
continue
if nums[i] + nums[j] > target and nums[i] + nums[j] >= 0:
break
left = j+1
right = n-1
while left<right:
sum_ = nums[i]+nums[j]+nums[left]+nums[right]
if sum_ == target:
res.append([nums[i] ,nums[j], nums[left] , nums[right]])
while left<right and nums[left] == nums[left+1] :
left+=1
left+=1
while left<right and nums[right] == nums[right-1]:
right-=1
right-=1
elif sum_ < target:
left+=1
else:
right-=1
return res
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端