【LeetCode】Sama的个人记录_65

【LeetCode】Sama的个人记录_65

关键在于"哈希表"的使用。
下面两种解法(迭代/递归)的写法都非常优美 >_<
class Solution {
    public Node copyRandomList(Node head) {
        if (head == null) {
            return null;
        }
        Map<Node, Node> map = new HashMap<>();
        // 先复制节点
        Node node = head;
        while (node != null) {
            map.put(node, new Node(node.val));
            node = node.next;
        }
        node = head;
        // 再复制指针
        while (node != null) {
            map.get(node).next = map.get(node.next);
            map.get(node).random = map.get(node.random);
            node = node.next;
        }
        return map.get(head);
    }
}
class Solution {

    private Map<Node, Node> map = new HashMap<>();

    public Node copyRandomList(Node node) {
        if (node == null) {
            return null;
        }
        if (map.containsKey(node)) {
            return map.get(node);
        }
        Node newNode = new Node(node.val);
        map.put(node, newNode);
        newNode.next = copyRandomList(node.next);
        newNode.random = copyRandomList(node.random);
        return newNode;
    }
}

 
 

【LeetCode】Sama的个人记录_65

核心思路是"对查分数组求前缀和"。
class Solution {
    public boolean isCovered(int[][] ranges, int left, int right) {
        int[] diff = new int[52];
        // 求查分数组
        for (int[] range : ranges) {
            diff[range[0]]++;
            diff[range[1] + 1]--;
        }
        // 求查分数组前缀和
        int[] preSum = new int[52];
        for (int i = 1; i < 52; i++) {
            preSum[i] = preSum[i - 1] + diff[i];
        }
        // 从left到right判断是否满足sum>0
        for (int i = left; i <= right; i++) {
            if (preSum[i] <= 0) {
                return false;
            }
        }
        return true;
    }
}

 
 

【LeetCode】Sama的个人记录_65

在树上找距离某个结点距离为K的结点似乎有些困难,那么...如果在图中找距离某个结点距离为K的结点呢?
这道题目的关键,就在于先使用哈希表记录父结点,从而使得在一个结点处,可以向三个方向扩展———这不就成了图的DFS/BFS了吗?
class Solution {

    private Map<TreeNode, TreeNode> parent = new HashMap<>();
    private List<Integer> res = new ArrayList<>();

    public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
        findParent(root);
        getNeighborK(target, null, k);
        return res;
    }

	// 记录父结点
    private void findParent(TreeNode node) {
        if (node.left != null) {
            parent.put(node.left, node);
            findParent(node.left);
        }
        if (node.right != null) {
            parent.put(node.right, node);
            findParent(node.right);
        }
    }

	// DFS
    private void getNeighborK(TreeNode node, TreeNode pre, int k) {
        if (node == null) {
            return;
        }
        if (k == 0) {
            res.add(node.val);
            return;
        }
        if (node.left != pre) {
            getNeighborK(node.left, node, k - 1);
        }
        if (node.right != pre) {
            getNeighborK(node.right, node, k - 1);
        }
        if (parent.get(node) != pre) {
            getNeighborK(parent.get(node), node, k - 1);
        }
    }
}

 
 
 
 
 
 
 
 
 
 
 
 
 
 

检索标记:863. 二叉树中所有距离为 K 的结点给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2输出:[7,4,1]解释:所求结点为与目标结点(值为 5)距离为 2 的结点,值分别为 7,4,以及 1 1893. 检查是否区域内所有整数都被覆盖给你一个二维整数数组 ranges 和两个整数 left 和 right 。每个 ranges[i] = [starti, endi] 表示一个从 starti 到 endi 的 闭区间 。如果闭区间 [left, right] 内每个整数都被 ranges 中 至少一个 区间覆盖,那么请你返回 true ,否则返回 false 。已知区间 ranges[i] = [starti, endi] ,如果整数 x 满足 starti <= x <= endi ,那么我们称整数x 被覆盖了。输入:ranges = [[1,2],[3,4],[5,6]], left = 2, right = 5输出:true解释:2 到 5 的每个整数都被覆盖了:2 被第一个区间覆盖。3 和 4 被第二个区间覆盖。 5 被第三个区间覆盖。138. 复制带随机指针的链表 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。返回复制链表的头节点。用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:val:一个表示 Node.val 的整数。random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。你的代码 只 接受原链表的头节点 head 作为传入参数。

上一篇:2021.7.23元素类型


下一篇:65. 有效数字