代码随想录day7

这次的代码是提高篇

454 两数之和2

关键点1:题目要求有多少个满足和为0的元组,这里key和val都要记录,所以采用unordered_map。key为数值,val为出现的次数。

关键点2:四数相加为0,可以两两和分为两组。遍历数组1和2的和,两层for循环。若map中没有该和,插入,val为1;若map中已经存在,将其val加1,iter->second++;迭代器定义为:auto iter;

关键点3:返回值为满足条件的元组个数,为int类型。同样,遍历数组c和d的和,将其带入map中寻找。使用.find()方法,找到即autao iter = map.find(sumb) != map.end(),这里的找到是通过迭代器定义,将int 类型的result++;

383、赎金信

关键点1:这题和242思路一样。只要记得定义并初始化数组的方式:int record[20] = {0};

15、三数之和

这道题目比较繁琐,特别是剪枝和去重逻辑

关键点1: 首先,对数组进行排序,目前排序和反转算法的使用都是方法在前,加起始和终止迭代器。ed:sort(nums.begin(),nums.end());此外,需要明确的一点是这些方法的区间原则都是左闭右开。此外,nuns.end()指向的是最后一个元素的下一个元素。

关键点2:从数组中找到三个重复的元素,三数之和为0。双指针法,遍历该数组元素,指针left从i+1开始向外遍历,指针right从nums.size()-1即右端开始向内遍历,终止条件为while(right > left)

关键点3:首先,若nums[i] > 0,则不用往下遍历了,因为数组排序过了,直接return  result;

另外,数组中可能有重复的元素,所以加剪枝:if(i > 0 && nums[i] == nums[i-1]);这里的i>0因为i=0时nums[i] == nums[i-1]越界;之所以nums[i] == nums[i-1]而不是nums[i] == nums[i+1]右边界可能越界,continue;

关键点4:当找到该元组时,需要判断right向内一位是否重复,若重复,--;同样,left若与left-1相同,left++;这里的去重和剪枝是不一样的,剪枝是当前点i和前一点对比;去重时重复点不在当前遍历的i处,而且也不用continue;

18、四数之和

这题与15题很相似

关键点1:相比15题,加了两层for循环遍历,外层i和内层k遍历,左右指针还在;

关键点2:target这里不是0了,可能为正、0、负;这里排序后还要再剪枝,if(nums[k] > target && nums[k] >= 0);在内层循环里还有二级剪枝:if(nums[k] + nums[i] > target && nums[k] + nums[i] >= 0)

### 关于代码随想录 Day04 的学习资料与解析 #### 一、Day04 主要内容概述 代码随想录 Day04 的主要内容围绕 **二叉树的遍历** 展开,包括前序、中序和后序三种遍历方式。这些遍历可以通过递归实现,也可以通过栈的方式进行迭代实现[^1]。 #### 二、二叉树的遍历方法详解 ##### 1. 前序遍历(Pre-order Traversal) 前序遍历遵循访问顺序:根节点 -> 左子树 -> 右子树。以下是基于递归的实现: ```python def preorderTraversal(root): result = [] def traversal(node): if not node: return result.append(node.val) # 访问根节点 traversal(node.left) # 遍历左子树 traversal(node.right) # 遍历右子树 traversal(root) return result ``` 对于迭代版本,则可以利用显式的栈来模拟递归过程: ```python def preorderTraversal_iterative(root): stack, result = [], [] current = root while stack or current: while current: result.append(current.val) # 访问当前节点 stack.append(current) # 将当前节点压入栈 current = current.left # 转向左子树 current = stack.pop() # 弹出栈顶元素 current = current.right # 转向右子树 return result ``` ##### 2. 中序遍历(In-order Traversal) 中序遍历遵循访问顺序:左子树 -> 根节点 -> 右子树。递归实现如下: ```python def inorderTraversal(root): result = [] def traversal(node): if not node: return traversal(node.left) # 遍历左子树 result.append(node.val) # 访问根节点 traversal(node.right) # 遍历右子树 traversal(root) return result ``` 迭代版本同样依赖栈结构: ```python def inorderTraversal_iterative(root): stack, result = [], [] current = root while stack or current: while current: stack.append(current) # 当前节点压入栈 current = current.left # 转向左子树 current = stack.pop() # 弹出栈顶元素 result.append(current.val) # 访问当前节点 current = current.right # 转向右子树 return result ``` ##### 3. 后序遍历(Post-order Traversal) 后序遍历遵循访问顺序:左子树 -> 右子树 -> 根节点。递归实现较为直观: ```python def postorderTraversal(root): result = [] def traversal(node): if not node: return traversal(node.left) # 遍历左子树 traversal(node.right) # 遍历右子树 result.append(node.val) # 访问根节点 traversal(root) return result ``` 而迭代版本则稍复杂一些,通常采用双栈法或标记法完成: ```python def postorderTraversal_iterative(root): if not root: return [] stack, result = [root], [] while stack: current = stack.pop() result.insert(0, current.val) # 插入到结果列表头部 if current.left: stack.append(current.left) # 先压左子树 if current.right: stack.append(current.right) # 再压右子树 return result ``` #### 三、补充知识点 除了上述基本的二叉树遍历外,Day04 还可能涉及其他相关内容,例如卡特兰数的应用场景以及组合问题的基础模板[^2][^4]。如果遇到具体题目,可以根据实际需求调用相应算法工具。 --- ####
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值