刷题笔记 - 0422

1、clone graph   用map结构存储原值和拷贝值,一一对应。

map红黑树实现,O(logn) 内部有序;每个节点要保存父节点、子节点及红黑属性,占用空间大。

unordered_map哈希表实现,查找O(1),内部无序;哈希表建立耗时。   常用unordered_map

class Solution {
public:
    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
        // 拷贝所有点  DFS写法
        if (!node)  return nullptr;
        unordered_map<int, UndirectedGraphNode *> table;
        return helper(node, table);
    }

    UndirectedGraphNode *helper(UndirectedGraphNode *node, unordered_map<int, UndirectedGraphNode*>& table) {
        if (!node)  return nullptr;
        // 如果表中已有数据
        if (table.find(node->label) != table.end()) {
            return table[node->label];
        }
        UndirectedGraphNode *newNode = new UndirectedGraphNode(node->label);
        table[node->label] = newNode;
        for (int i = 0; i < node->neighbors.size(); i++) {
            UndirectedGraphNode *tmp = helper(node->neighbors[i], table);
            newNode->neighbors.push_back(tmp);
        }
        return newNode;
    }
};
 1 /**
 2  * Definition for undirected graph.
 3  * struct UndirectedGraphNode {
 4  *     int label;
 5  *     vector<UndirectedGraphNode *> neighbors;
 6  *     UndirectedGraphNode(int x) : label(x) {};
 7  * };
 8  */
 9 class Solution {
10 public:
11     UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
12         // 拷贝所有点  用BFS或DFS遍历都可以  是否已拷贝用map判断
13         if (!node)  return nullptr;
14         unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> map;
15         UndirectedGraphNode *p1 = node;
16         UndirectedGraphNode *p2 = new UndirectedGraphNode(node->label);
17         queue<UndirectedGraphNode *> q;
18         q.push(node);
19         map[p1] = p2;
20         while (!q.empty()) {
21             p1 = q.front();   q.pop();
22             p2 = map[p1];
23             for (int i = 0; i < p1->neighbors.size(); i++) {        // 注意对邻接点的判断 若map中已有,则直接设置p2的邻接点;否则插入map,入队列处理
24                 UndirectedGraphNode *tmp = p1->neighbors[i];
25                 if (map.count(tmp) != 0) {
26                     p2->neighbors.push_back(map[tmp]);
27                 } else {
28                     UndirectedGraphNode *copy = new UndirectedGraphNode(tmp->label);
29                     map[tmp] = copy;
30                     p2->neighbors.push_back(map[tmp]);
31                     q.push(tmp);
32                 }
33             }
34         }
35         return map[node];
36     }
37 };

2、二叉树序列化    https://leetcode.com/problems/serialize-and-deserialize-bst/discuss/93167/Concise-C++-19ms-solution-beating-99.4

队列的数组实现与链表实现,用vector实现queue

原文地址:https://www.cnblogs.com/li-ling/p/8911518.html

时间: 2024-11-06 07:15:48

刷题笔记 - 0422的相关文章

【leetcode刷题笔记】Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

【leetcode刷题笔记】Longest Consecutive Sequence

Given an unsorted array of integers, find the length of the longest consecutive elements sequence. For example,Given [100, 4, 200, 1, 3, 2],The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4. Your algorithm should run in

【leetcode刷题笔记】Remove Duplicates from Sorted Array II

Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For example,Given sorted array A = [1,1,1,2,2,3], Your function should return length = 5, and A is now [1,1,2,2,3]. 题解: 设置两个变量:右边kepler和前向游标forward.如果当前kepeler所指的元素和

【leetcode刷题笔记】Restore IP Addresses

Given a string containing only digits, restore it by returning all possible valid IP address combinations. For example:Given "25525511135", return ["255.255.11.135", "255.255.111.35"]. (Order does not matter) 题解:深度优先搜索.用resul

【leetcode刷题笔记】Path Sum

Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. For example:Given the below binary tree and sum = 22, 5 / 4 8 / / 11 13 4 / \ 7 2 1 return true, as t

【leetcode刷题笔记】Insertion Sort List

Sort a linked list using insertion sort. 题解:实现链表的插入排序. 要注意的地方就是,处理链表插入的时候尽量往当前游标的后面插入,而不要往前面插入,后者非常麻烦.所以每次利用kepeler.next.val和head.val比较大小,而不是kepeler.val和head.val比较大小,因为如果用后者,要把head指向的节点插入到kepeler指向的节点的前面,如果kepeler指向的节点是头结点,就更麻烦了. 代码如下: 1 /** 2 * Defi

【leetcode刷题笔记】Max Points on a Line

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. 题解: 思路比较简单,每条直线都可以表示为y=kx+b,所以对于任意三点,如果它们共线,那么它们中任意两点的斜率都相等. 所以就遍历points数组,对其中的每一个元素计算它和位于它后面的数组元素的斜率并保存在一个hashmap中. 这个hashmap的键就是两点构成直线的斜率,值就是和当前元素po

【leetcode刷题笔记】Spiral Matrix II

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example,Given n = 3, You should return the following matrix: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 题解:以前做过的Spiral Matrix是给一个矩阵螺旋式的输出,这道题是给一个n,螺旋式的

【leetcode刷题笔记】Set Matrix Zeroes

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 题解:因为题目要求原地算法,所以我们只能利用矩阵第一行和第一列存放置零信息. 首先遍历第一行和第一列,看他们是否需要全部置零,用两个变量first_column_zero和first_row_zero来记录: 遍历矩阵,如果某个位置matrix[i][j]出现了0,就把matrix[i][0]和Matrix[0