2024-09-29

  1. 105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        this->preorder = preorder;
        this->inorder = inorder;
        return build(0, preorder.size() - 1, 0, inorder.size() - 1);
    }

private:
    vector<int> preorder;
    vector<int> inorder;

    TreeNode* build(int l1, int r1, int l2, int r2) {
        if (l1 > r1) return nullptr;
        TreeNode* root = new TreeNode(preorder[l1]);
        // preorder[l1...r1], inorder[l2...r2]
        int mid = l2;
        while (inorder[mid] != preorder[l1]) mid++;
        // preorder[l1...r1], inorder[l2...mid...r2];
        root->left = build(l1 + 1, l1 + (mid - l2), l2, mid - 1);
        root->right = build(l1 + mid - l2 + 1, r1, mid + 1, r2);
        return root;
    }
};
  1. 297. 二叉树的序列化与反序列化 - 力扣(LeetCode)
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Codec {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string ans;
        rserialize(root, ans);
        return ans;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        list<string> dataArray;
        string str;
        for (char ch : data) {
            if (ch == ',') {
                dataArray.push_back(str);
                str.clear();
            }
            else 
                str += ch;
        }
        if (!str.empty()) {
            dataArray.push_back(str);
            str.clear();
        }
        return rdeserialize(dataArray);
    }

private:
    void rserialize(TreeNode* root, string& str) {
        if (root == nullptr) {
            str += "null,";
            return;
        }
        str += to_string(root->val) + ",";
        rserialize(root->left, str);
        rserialize(root->right, str);
    }

    TreeNode* rdeserialize(list<string>& dataArray) {
        if (dataArray.front() == "null") {
            dataArray.erase(dataArray.begin());
            return nullptr;
        }
        TreeNode* root = new TreeNode(stoi(dataArray.front()));
        dataArray.erase(dataArray.begin());
        root->left = rdeserialize(dataArray);
        root->right = rdeserialize(dataArray);
        return root;
    }
};

// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans = deser.deserialize(ser.serialize(root));
  1. 1245. 树的直径 - 力扣(LeetCode)
class Codec {
public:
    int treeDiameter(vector<vector<int>>& edges) {
        n = 0;
        for (vector<int> edge : edges) {
            int x = edge[0];
            int y = edge[1];
            n = max(n, max(x, y));
        }
        n++;
        for (int i = 0; i < n; i++) to.push_back({});
        for (vector<int> edge : edges) {
            int x = edge[0];
            int y = edge[1];
            to[x].push_back(y);
            to[y].push_back(x);
        }
        int p = findFarthet(0).first;
        return findFarthet(p).second;
    }

private:
    vector<vector<int>> to;
    int n;

    // <点,距离>
    pair<int, int> findFarthet(int start) {
        vector<int> depth(n, -1);
        queue<int> q;
        q.push(start);
        depth[start] = 0;
        while (!q.empty()) {
            int x = q.front();
            q.pop();
            for (int y : to[x]) {
                if (depth[y] != -1) continue;
                depth[y] = depth[x] + 1;
                q.push(y);
            }
        }
        int ans = start;
        for (int i = 0; i < n; i++)
            if (depth[i] > depth[ans]) ans = i;
        return {ans, depth[ans]};
    }
};
  1. 236. 二叉树的最近公共祖先 - 力扣(LeetCode)
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        this->p = p;
        this->q = q;
        dfs(root);
        return ans;
    }

private:
    TreeNode* p;
    TreeNode* q;
    TreeNode* ans;

    pair<bool, bool> dfs(TreeNode* root) {
        if (root == nullptr) return {false, false};
        pair<bool, bool> leftRst = dfs(root->left);
        pair<bool, bool> rightRst = dfs(root->right);
        pair<bool, bool> result;
        result.first = leftRst.first || rightRst.first || root->val == p->val;
        result.second = leftRst.second || rightRst.second || root->val == q->val;
        if (result.first && result.second && ans == nullptr) ans = root;
        return result;
    }
};
  1. 684. 冗余连接 - 力扣(LeetCode)
class Solution {
public:
    vector<int> findRedundantConnection(vector<vector<int>>& edges) {
        int n = 0;
        for (vector<int> edge : edges) {
            int x = edge[0];
            int y = edge[1];
            n = max(n, max(x, y));
        }
        // 出边数组
        to = vector<vector<int>>(n + 1);
        visited = vector<bool>(n + 1);
        for (vector<int> edge : edges) {
            int x = edge[0];
            int y = edge[1];
            to[x].push_back(y);
            to[y].push_back(x);
            hasCycle = false;
            dfs(x, 0);
            if (hasCycle) return edge;
        }
        return {};
    }

private:
    vector<vector<int>> to;
    vector<bool> visited;
    bool hasCycle;

    void dfs(int x, int fa) {
        if (visited[x]) return;
        visited[x] = true;
        for (int y : to[x]) {
            if (y == fa) continue;
            if (!visited[y]) dfs(y, x);
            else hasCycle = true;
        }
        // 一般dfs此处无需恢复
        // 不过此题需要多次使用visited数组,所以要恢复现场
        visited[x] = false;
    }
};
  1. 207. 课程表 - 力扣(LeetCode)
class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        to = vector<vector<int>>(numCourses);
        inDegree = vector<int>(numCourses, 0);
        for (vector<int>& pre : prerequisites) {
            int ai = pre[0];
            int bi = pre[1];
            to[bi].push_back(ai);
            inDegree[ai]++;
        }
        queue<int> q;
        // 拓扑排序
        // 第一步:从零入度点出发
        for (int i = 0; i < numCourses; i++)
            if (inDegree[i] == 0) q.push(i);
        vector<int> lessons;
        while (!q.empty()) {
            int x = q.front();
            q.pop();
            lessons.push_back(x);
            // 第二步:扩展一个点,周围的点入度减一
            for (int y : to[x]) {
                inDegree[y]--;
                // 第三步:入度减为0,表示可以入队了
                if (inDegree[y] == 0)
                    q.push(y);
            }
        }
        return lessons.size() == numCourses;
    }

private:
    vector<vector<int>> to;
    vector<int> inDegree;
};
  1. 210. 课程表 II - 力扣(LeetCode)
class Solution {
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        to = vector<vector<int>>(numCourses);
        inDegree = vector<int>(numCourses, 0);
        for (vector<int>& pre : prerequisites) {
            int ai = pre[0];
            int bi = pre[1];
            to[bi].push_back(ai);
            inDegree[ai]++;
        }
        queue<int> q;
        // 拓扑排序
        // 第一步:从零入度点出发
        for (int i = 0; i < numCourses; i++)
            if (inDegree[i] == 0) q.push(i);
        vector<int> lessons;
        while (!q.empty()) {
            int x = q.front();
            q.pop();
            lessons.push_back(x);
            // 第二步:扩展一个点,周围的点入度减一
            for (int y : to[x]) {
                inDegree[y]--;
                // 第三步:入度减为0,表示可以入队了
                if (inDegree[y] == 0)
                    q.push(y);
            }
        }
        return lessons.size() == numCourses ? lessons : vector<int>();
    }

private:
    vector<vector<int>> to;
    vector<int> inDegree;
};
  1. 17. 电话号码的字母组合 - 力扣(LeetCode)
class Solution {
public:
    vector<string> letterCombinations(string digits) {
        if (digits == "") return {};
        alphabet['2'] = "abc";
        alphabet['3'] = "def";
        alphabet['4'] = "ghi";
        alphabet['5'] = "jkl";
        alphabet['6'] = "mno";
        alphabet['7'] = "pqrs";
        alphabet['8'] = "tuv";
        alphabet['9'] = "wxyz";
        this->digits = digits;
        dfs(0);
        return ans;
    }

private:
    vector<string> ans;
    string digits;
    unordered_map<char, string> alphabet;
    string str;

    void dfs(int index) {
        if (index == digits.length()) {
            ans.push_back(str);
            return;
        }
        for (char ch : alphabet[digits[index]]) {
            str.push_back(ch);
            dfs(index + 1);
            str.pop_back();
        }
    }
};
  1. 51. N 皇后 - 力扣(LeetCode)
class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        this->n = n;
        used = vector<bool>(n, false);
        dfs(0);
        vector<vector<string>> ans;
        for (vector<int>& p : result) {
            vector<string> pattern(n, string(n, '.'));
            for (int row = 0; row < n; row++) 
                pattern[row][p[row]] = 'Q';
            ans.push_back(pattern);
        }
        return ans;
    }

private:
    int n;
    vector<bool> used;
    unordered_map<int, bool> usedPlus;
    unordered_map<int, bool> usedMinus;
    vector<int> p;
    vector<vector<int>> result;

    void dfs(int row) {
        if (row == n) {
            result.push_back(p);
            return;
        }
        for (int col = 0; col < n; col++)
            if (!used[col] && !usedPlus[row + col] && !usedMinus[row - col]) {
                used[col] = true;
                usedPlus[row + col] = true;
                usedMinus[row - col] = true;
                p.push_back(col);
                dfs(row + 1);
                p.pop_back();
                usedMinus[row - col] = false;
                usedPlus[row + col] = false;
                used[col] = false;
            }
    }
};
  1. 200. 岛屿数量 - 力扣(LeetCode)
class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        m = grid.size();
        n = grid[0].size();
        this->grid = grid;
        visited = vector<vector<bool>>(m, vector<bool>(n, false));
        int ans = 0;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                if (grid[i][j] == '1' && !visited[i][j]) {
                    ans++;
                    bfs(i, j);
                }
        return ans;
    }

private:
    int m, n;
    vector<vector<char>> grid;
    vector<vector<bool>> visited;

    void bfs(int sx, int sy) {
        const int dx[4] = {-1, 0, 0, 1};
        const int dy[4] = {0, -1, 1, 0};
        queue<pair<int, int>> q;
        q.push({sx, sy});
        visited[sx][sy] = true;
        while (!q.empty()) {
            int x = q.front().first;
            int y = q.front().second;
            q.pop();
            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if (nx < 0 || nx >= m || ny < 0 || ny >= n) continue;
                if (visited[nx][ny]) continue;
                if (grid[nx][ny] != '1') continue;
                q.push({nx, ny});
                visited[nx][ny] = true;
            }
        }
    }
};
  1. 433. 最小基因变化 - 力扣(LeetCode)
class Solution {
public:
    int minMutation(string startGene, string endGene, vector<string>& bank) {
        for (string& seq : bank) hashBank.insert(seq);
        if (hashBank.find(endGene) == hashBank.end()) return -1;
        const char gene[4] = {'A', 'C', 'G', 'T'};
        depth[startGene] = 0;
        queue<string> q;
        q.push(startGene);
        while (!q.empty()) {
            string s = q.front();
            q.pop();
            for (int i = 0; i < 8; i++)
                for (int j = 0; j < 4; j++) 
                    if (s[i] != gene[j]) {
                        string ns = s;
                        ns[i] = gene[j];
                        if (hashBank.find(ns) == hashBank.end()) continue;
                        if (depth.find(ns) != depth.end()) continue;
                        depth[ns] = depth[s] + 1;
                        q.push(ns);
                        if (ns == endGene) return depth[ns];
                    }
        }
        return -1;
    }

private:
    unordered_set<string> hashBank;
    unordered_map<string, int> depth;
};
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容