LCR 157. 套餐内商品的排列顺序
某店铺将用于组成套餐的商品记作字符串 goods,其中 goods[i] 表示对应商品。请返回该套餐内所含商品的 全部排列方式 。
返回结果 无顺序要求,但不能含有重复的元素。
示例 1:
**输入:**goods = “agew”
输出:[“aegw”,“aewg”,“agew”,“agwe”,“aweg”,“awge”,“eagw”,“eawg”,“egaw”,“egwa”,“ewag”,“ewga”,“gaew”,“gawe”,“geaw”,“gewa”,“gwae”,“gwea”,“waeg”,“wage”,“weag”,“wega”,“wgae”,“wgea”]
提示:
1 <= goods.length <= 8
全排列问题,首先想到递归,但是题目中没有说goods中元素部重复。
所以直接全排列会产生很多重复,我们可以在最后去重,也可以在全排列过程中去重。
对于 aab,直接全排列其实就是我们把aa看成了a1 a2去排列,我们需要保证a1出现过的位置不再列举a2。
有一种方法就是固定a1 a2出现的顺序,保证列举a时只有列举a1之后再列举a2。
假设当前列举go ...
LCR 156. 序列化与反序列化二叉树
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例 1:
**输入:**root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
示例 2:
**输入:**root = []
输出:[]
示例 3:
**输入:**root = [1]
输出:[1]
示例 4:
**输入:**root = [1,2]
输出:[1,2]
提示:
树中结点数在范围 [0, 10(4)] 内
-1000 <= Node.val <= 1000
将二叉树抽象出来再还原,之前 ...
LCR 155. 将二叉搜索树转化为排序的双向链表
将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。
对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
特别地,我们希望可以 就地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针。
示例 1:
**输入:**root = [4,2,5,1,3]
输出:[1,2,3,4,5]
**解释:**下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。
示例 2:
**输入:**root = [2,1,3]
输出:[1,2,3]
示例 3:
**输入:**root = []
输出:[]
**解释:**输入是空树,所以输出也是空链表。
示例 4:
**输入:**root = [1]
输出:[1]
提示:
-1000 <= Node.val <= 1000
Node.left.val < Node.val < Node.right.val
Node.val 的所有值都是独一无二的
0 < ...
LCR 154. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
这题关键是random的指向,我们可以用哈希表来记录每个旧链表结点对应的新链表结点
12345678910111213141516171819202122class Solution {public: Node *copyRandomList(Node *head) { if (head == NULL) return NULL; unordered_map<Node *, Node *> flag; Node *i = head; while (i != NULL) { flag[i] = new Node(i->val); i = i->next; } i = head; ...
LCR 152. 验证二叉搜索树的后序遍历序列
请实现一个函数来判断整数数组 postorder 是否为二叉搜索树的后序遍历结果。
示例 1:
输入: postorder = [4,9,6,5,8]
输出: false
**解释:**从上图可以看出这不是一颗二叉搜索树
示例 2:
输入: postorder = [4,6,5,9,8]
输出: true
**解释:**可构建的二叉搜索树如上图
提示:
数组长度 <= 1000
postorder 中无重复数字
二叉搜索树,左子树元素小于root,右子树大于root
后序遍历结果为[左子树后序,右子树后序,root]
所以我们可以直接找到一个子树的范围,然后判断另一个子树元素是否满足均小于/大于root
满足则继续判断两个子树内部情况
12345678910111213141516171819class Solution {public: bool verifyTreeOrder(vector<int> &postorder) { if (postorder.empty()) return tr ...
LCR 151. 彩灯装饰记录 III
一棵圣诞树记作根节点为 root 的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果:
第一层按照从左到右的顺序记录
除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右,第二层为从右到左。
示例 1:
**输入:**root = [8,17,21,18,null,null,6]
输出:[[8],[21,17],[18,6]]
提示:
节点总数 <= 1000
同层序遍历,每层要输出的元素是提前能知道的,所以我们可以根据标志位直接找到当前元素应该放在哪个位置
1234567891011121314151617181920212223242526272829class Solution {public: vector<vector<int>> decorateRecord(TreeNode *root) { vector<vector<int>> ans; queue<TreeNode *> que; if (root ! ...









