TypechoJoeTheme

Toasobi的博客

搜索到 47 篇与 的结果 ———
2023-03-20

复杂链表的复制(中等)

复杂链表的复制(中等)
这道题使用哈希表!感觉思路非常清奇!我们不同于以前复制简单链表那样使用双指针边动边复制,因为这个node除了存储next之外还有一个random。因为random可以指向随便一个node,所以这道题我们需要一个快速映射所有节点的方法,那就是哈希!我们将复制出来的节点每一个与旧节点进行映射,一一对应,那在构造新链表的next和random的时候,我们只需要使用旧链表的next和random的新链表的映射即可。代码如下:<div>class Solution { class Solution { public Node copyRandomList(Node head) { if(head == null) return null; Node cur = head; Map<Node, Node> map = new HashMap<>(); // 3. 复制各节点,并建立 “原节点 -> 新节点” 的 Map 映射 while(cur != nu...
2023-03-20

剑指offer(第二版)

0 阅读
0 评论
2023年03月20日
0 阅读
0 评论
2023-03-20

二叉树中和为某个值的路径(中等)

二叉树中和为某个值的路径(中等)
这道题的主要思路也是dfs,每次往下搜一次,目标数字要减去当前节点的val值。我们使用了一个list叫path来存储每一次搜索下去时经过的节点的val值。如果左右边都走过了还是不满足条件,则会将path中的值移除一个(回溯)注意res.add(new LinkedList(path)),这个比较关键,不能res.add(path),因为这样后面的path改变后list中的path也会更改。下面来看看代码:<div>class Solution { LinkedList<List<Integer>> res = new LinkedList<>(); LinkedList<Integer> path = new LinkedList<>(); public List<List<Integer>> pathSum(TreeNode root, int sum) { recur(root, sum); return res; ...
2023-03-20

剑指offer(第二版)

0 阅读
0 评论
2023年03月20日
0 阅读
0 评论
2023-03-20

二叉搜索树的后序遍历序列(中等)

二叉搜索树的后序遍历序列(中等)
这道题和根据前后遍历序列构造二叉树很相似,就是找到左右子树的范围,递归到只剩一个节点。结束的判断条件是:左子树的val全部小于根,右子树的val全部大于根,在此基础上指针偏移(看代码),最后一定得落在根节点上,否则不是该树的后序遍历。代码如下:<div>class Solution { public boolean verifyPostorder(int[] postorder) { return recur(postorder, 0, postorder.length - 1); } boolean recur(int[] postorder, int i, int j) { if(i >= j) return true; int p = i; while(postorder[p] < postorder[j]) p++; int m = p; //找左子树范围递归 while(postorder[p] > postorder[j...
2023-03-20

剑指offer(第二版)

0 阅读
0 评论
2023年03月20日
0 阅读
0 评论
2023-03-16

从上打印二叉树2(中等)

从上打印二叉树2(中等)
- 这题上一题是从上至下打印二叉树,其实就是层序遍历,**这题多了一个偶数高度的数组要逆转。** 上面是上一题的图。虽然是层序遍历,但是要求是每一层的数据都要一个list存储。所以这两道题的难点之一就是如何知道哪些数据是在同一个高度的,并将这些数据放入各个list中。而第二个难点就是逆转数组了对于如何知道数据是否在一个高度,我一开始的想法是用hashmap,key值存储高度,value存储数据。但是由于hashmap的key值不能重复只能就此作罢。我甚至想到了使用2的指数表示每一层的元素个数,同时使用一个int记录该层缺失多少元素。但是由于该层缺失多少元素非常难求,这个方法在只有一条线的二叉树面前直接寄掉了;;最后是题解给我的启发,在每次对队列添加完一层的元素后使用队列的长度作为for循环的临界值,每次for循环完成后表示一层的数据都遍历完成,在for循环中每遍历一个添加至一个list中,最后放入大list中,并重新new list()将list全部重置。代码如下:<div>/** * Definition for a binary tree node. * pu...
2023-03-16

剑指offer(第二版)

0 阅读
0 评论
2023年03月16日
0 阅读
0 评论
2023-03-16

栈的压入,弹出顺序(中等)

栈的压入,弹出顺序(中等)
这道题主要看你想没想到解题思路,想到了这道题就很简单思路:将pushed按照顺序压入栈中,每压一次就要判读栈顶元素是否和poped数组首位相同,如果相同则弹栈,并且while继续比较后一位。最后如果栈为空,则表示该poped是pushed的弹出序列代码如下(已加注释):<div>class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { LinkedList<Integer> stack = new LinkedList<>(); int index; //pushed下标位 int index2 = 0; //poped下标位 int point = 0; //栈中指针 为0则栈为空 boolean flag = false; //代表传入的参数是否有进入下面的判断,没有进入说明pushed长度为0 //按顺序压入 ...
2023-03-16

剑指offer(第二版)

0 阅读
0 评论
2023年03月16日
0 阅读
0 评论