首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >常见算法题

常见算法题

原创
作者头像
花落花相惜
修改2021-11-25 13:06:01
修改2021-11-25 13:06:01
5150
举报

一、二叉树中序遍历

代码语言:txt
复制
class Solution {
代码语言:txt
复制
public:
代码语言:txt
复制
    void inorder(TreeNode* root, vector<int>& res) {
代码语言:txt
复制
        if (!root) {
代码语言:txt
复制
            return;
代码语言:txt
复制
        }
代码语言:txt
复制
        inorder(root->left, res);
代码语言:txt
复制
        res.push_back(root->val);
代码语言:txt
复制
        inorder(root->right, res);
代码语言:txt
复制
    }
代码语言:txt
复制
    vector<int> inorderTraversal(TreeNode* root) {
代码语言:txt
复制
        vector<int> res;
代码语言:txt
复制
        inorder(root, res);
代码语言:txt
复制
        return res;
代码语言:txt
复制
    }
代码语言:txt
复制
};

二、二叉树层序遍历

广度优先

代码语言:txt
复制
class Solution {
代码语言:txt
复制
public:
代码语言:txt
复制
    vector<vector<int>> levelOrder(TreeNode* root) {
代码语言:txt
复制
        vector <vector <int>> ret;
代码语言:txt
复制
        if (!root) {
代码语言:txt
复制
            return ret;
代码语言:txt
复制
        }
代码语言:txt
复制
        queue <TreeNode*> q;
代码语言:txt
复制
        q.push(root);
代码语言:txt
复制
        while (!q.empty()) {
代码语言:txt
复制
            int currentLevelSize = q.size();
代码语言:txt
复制
            ret.push_back(vector <int> ());
代码语言:txt
复制
            for (int i = 1; i <= currentLevelSize; ++i) {
代码语言:txt
复制
                auto node = q.front(); q.pop();
代码语言:txt
复制
                ret.back().push_back(node->val);
代码语言:txt
复制
                if (node->left) q.push(node->left);
代码语言:txt
复制
                if (node->right) q.push(node->right);
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
        return ret;
代码语言:txt
复制
    }
代码语言:txt
复制
};

三、翻转二叉树

代码语言:txt
复制
class Solution {
代码语言:txt
复制
public:
代码语言:txt
复制
    TreeNode* invertTree(TreeNode* root) {
代码语言:txt
复制
        if (root == nullptr) {
代码语言:txt
复制
            return nullptr;
代码语言:txt
复制
        }
代码语言:txt
复制
        TreeNode* left = invertTree(root->left);
代码语言:txt
复制
        TreeNode* right = invertTree(root->right);
代码语言:txt
复制
        root->left = right;
代码语言:txt
复制
        root->right = left;
代码语言:txt
复制
        return root;
代码语言:txt
复制
    }
代码语言:txt
复制
};

四、反转链表

五、岛屿数量

image.png

我们可以将二维网格看成一个无向图,竖直或水平相邻的 11 之间有边相连。

为了求出岛屿的数量,我们可以扫描整个二维网格。如果一个位置为 11,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 11

都会被重新标记为 00。

最终岛屿的数量就是我们进行深度优先搜索的次数。

代码语言:txt
复制
class Solution {
代码语言:txt
复制
private:
代码语言:txt
复制
    void dfs(vector<vector<char>>& grid, int r, int c) {
代码语言:txt
复制
        int nr = grid.size();
代码语言:txt
复制
        int nc = grid[0].size();
代码语言:txt
复制
        grid[r][c] = '0';
代码语言:txt
复制
        if (r - 1 >= 0 && grid[r-1][c] == '1') dfs(grid, r - 1, c);
代码语言:txt
复制
        if (r + 1 < nr && grid[r+1][c] == '1') dfs(grid, r + 1, c);
代码语言:txt
复制
        if (c - 1 >= 0 && grid[r][c-1] == '1') dfs(grid, r, c - 1);
代码语言:txt
复制
        if (c + 1 < nc && grid[r][c+1] == '1') dfs(grid, r, c + 1);
代码语言:txt
复制
    }
代码语言:txt
复制
public:
代码语言:txt
复制
    int numIslands(vector<vector<char>>& grid) {
代码语言:txt
复制
        int nr = grid.size();
代码语言:txt
复制
        if (!nr) return 0;
代码语言:txt
复制
        int nc = grid[0].size();
代码语言:txt
复制
        int num_islands = 0;
代码语言:txt
复制
        for (int r = 0; r < nr; ++r) {
代码语言:txt
复制
            for (int c = 0; c < nc; ++c) {
代码语言:txt
复制
                if (grid[r][c] == '1') {
代码语言:txt
复制
                    ++num_islands;
代码语言:txt
复制
                    dfs(grid, r, c);
代码语言:txt
复制
                }
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
        return num_islands;
代码语言:txt
复制
    }
代码语言:txt
复制
};

六、买卖股票的最佳时机

七、全排列

image.png

代码语言:txt
复制
class Solution {
代码语言:txt
复制
public:
代码语言:txt
复制
    void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){
代码语言:txt
复制
        // 所有数都填完了
代码语言:txt
复制
        if (first == len) {
代码语言:txt
复制
            res.emplace_back(output);
代码语言:txt
复制
            return;
代码语言:txt
复制
        }
代码语言:txt
复制
        for (int i = first; i < len; ++i) {
代码语言:txt
复制
            // 动态维护数组
代码语言:txt
复制
            swap(output[i], output[first]);
代码语言:txt
复制
            // 继续递归填下一个数
代码语言:txt
复制
            backtrack(res, output, first + 1, len);
代码语言:txt
复制
            // 撤销操作
代码语言:txt
复制
            swap(output[i], output[first]);
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
    vector<vector<int>> permute(vector<int>& nums) {
代码语言:txt
复制
        vector<vector<int> > res;
代码语言:txt
复制
        backtrack(res, nums, 0, (int)nums.size());
代码语言:txt
复制
        return res;
代码语言:txt
复制
    }
代码语言:txt
复制
};

八、比较版本号

image.png

image.png

代码语言:txt
复制
class Solution:
代码语言:txt
复制
    def compareVersion(self, version1: str, version2: str) -> int:
代码语言:txt
复制
        ver1 = version1.split('.')
代码语言:txt
复制
        ver2 = version2.split('.')
代码语言:txt
复制
        # 用int可以去除前导零
代码语言:txt
复制
        len1 = len(ver1)
代码语言:txt
复制
        len2 = len(ver2)
代码语言:txt
复制
        if len1 > len2:
代码语言:txt
复制
            ver2.extend(['0'] * (len1 - len2))
代码语言:txt
复制
        if len2 > len1:
代码语言:txt
复制
            ver1.extend(['0'] * (len2 - len1))
代码语言:txt
复制
        for i in range(max(len1, len2)):
代码语言:txt
复制
            if int(ver1[i]) > int(ver2[i]):
代码语言:txt
复制
                return 1
代码语言:txt
复制
            elif int(ver1[i]) < int(ver2[i]):
代码语言:txt
复制
                return - 1
代码语言:txt
复制
        return 0
代码语言:txt
复制
print(Solution().compareVersion(version1 = "1", version2 = "1.1"))

九、验证IPV4

image.png

image.png

十、目标和

image.png

image.png

代码语言:txt
复制
class Solution {
代码语言:txt
复制
public:
代码语言:txt
复制
    int findTargetSumWays(vector<int>& nums, int S) {
代码语言:txt
复制
        int sum = 0;
代码语言:txt
复制
        for (int i = 0; i < nums.size(); i++) sum += nums[i];
代码语言:txt
复制
        if (S > sum) return 0; // 此时没有方案
代码语言:txt
复制
        if ((S + sum) % 2 == 1) return 0; // 此时没有方案
代码语言:txt
复制
        int bagSize = (S + sum) / 2;
代码语言:txt
复制
        vector<int> dp(bagSize + 1, 0);
代码语言:txt
复制
        dp[0] = 1;
代码语言:txt
复制
        for (int i = 0; i < nums.size(); i++) {
代码语言:txt
复制
            for (int j = bagSize; j >= nums[i]; j--) {
代码语言:txt
复制
                dp[j] += dp[j - nums[i]];
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
        return dp[bagSize];
代码语言:txt
复制
    }
代码语言:txt
复制
};

代码语言:txt
复制
class Solution {
代码语言:txt
复制
public:
代码语言:txt
复制
    int findTargetSumWays(vector<int>& nums, int S) {
代码语言:txt
复制
        long sum = 0;
代码语言:txt
复制
        for (const int &it : nums) sum += it;
代码语言:txt
复制
        if ((S + sum) % 2 == 1 || S > sum) return 0;
代码语言:txt
复制
        S = (S + sum) / 2;
代码语言:txt
复制
        int *dp = new int[S + 1];
代码语言:txt
复制
        memset(dp, 0, (S + 1) * sizeof(int));
代码语言:txt
复制
        dp[0] = 1;
代码语言:txt
复制
        for (const int &it : nums) {
代码语言:txt
复制
            for (int j = S; j >= it; j--)
代码语言:txt
复制
                dp[j] += dp[j - it];
代码语言:txt
复制
        }
代码语言:txt
复制
        int ans = dp[S];
代码语言:txt
复制
        delete[] dp;
代码语言:txt
复制
        return ans;
代码语言:txt
复制
    }
代码语言:txt
复制
};

代码语言:txt
复制
class Solution {
代码语言:txt
复制
public:
代码语言:txt
复制
    int findTargetSumWays(vector<int>& nums, int S) {
代码语言:txt
复制
        return dfs(nums, S, 0);
代码语言:txt
复制
    }
代码语言:txt
复制
    int dfs(vector<int> &nums, uint target, int left) {
代码语言:txt
复制
        if (target == 0 && left == nums.size()) return 1;
代码语言:txt
复制
        if (left >= nums.size()) return 0;
代码语言:txt
复制
        int ans = 0;
代码语言:txt
复制
        ans += dfs(nums, target - nums[left], left + 1);
代码语言:txt
复制
        ans += dfs(nums, target + nums[left], left + 1);
代码语言:txt
复制
        return ans;
代码语言:txt
复制
    }
代码语言:txt
复制
};

十一、网格最短路径

image.png

image.png

代码语言:txt
复制
struct Nagato {
代码语言:txt
复制
    int x, y;
代码语言:txt
复制
    int rest;
代码语言:txt
复制
    Nagato(int _x, int _y, int _r): x(_x), y(_y), rest(_r) {}
代码语言:txt
复制
};
代码语言:txt
复制
class Solution {
代码语言:txt
复制
private:
代码语言:txt
复制
    static constexpr int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
代码语言:txt
复制
public:
代码语言:txt
复制
    int shortestPath(vector<vector<int>>& grid, int k) {
代码语言:txt
复制
        int m = grid.size(), n = grid[0].size();
代码语言:txt
复制
        if (m == 1 && n == 1) {
代码语言:txt
复制
            return 0;
代码语言:txt
复制
        }
代码语言:txt
复制
        k = min(k, m + n - 3);
代码语言:txt
复制
        bool visited[m][n][k + 1];
代码语言:txt
复制
        memset(visited, false, sizeof(visited));
代码语言:txt
复制
        queue<Nagato> q;
代码语言:txt
复制
        q.emplace(0, 0, k);
代码语言:txt
复制
        visited[0][0][k] = true;
代码语言:txt
复制
        for (int step = 1; q.size() > 0; ++step) {
代码语言:txt
复制
            int cnt = q.size();
代码语言:txt
复制
            for (int _ = 0; _ < cnt; ++_) {
代码语言:txt
复制
                Nagato cur = q.front();
代码语言:txt
复制
                q.pop();
代码语言:txt
复制
                for (int i = 0; i < 4; ++i) {
代码语言:txt
复制
                    int nx = cur.x + dirs[i][0];
代码语言:txt
复制
                    int ny = cur.y + dirs[i][1];
代码语言:txt
复制
                    if (nx >= 0 && nx < m && ny >= 0 && ny < n) {
代码语言:txt
复制
                        if (grid[nx][ny] == 0 && !visited[nx][ny][cur.rest]) {
代码语言:txt
复制
                            if (nx == m - 1 && ny == n - 1) {
代码语言:txt
复制
                                return step;
代码语言:txt
复制
                            }
代码语言:txt
复制
                            q.emplace(nx, ny, cur.rest);
代码语言:txt
复制
                            visited[nx][ny][cur.rest] = true;
代码语言:txt
复制
                        }
代码语言:txt
复制
                        else if (grid[nx][ny] == 1 && cur.rest > 0 && !visited[nx][ny][cur.rest - 1]) {
代码语言:txt
复制
                            q.emplace(nx, ny, cur.rest - 1);
代码语言:txt
复制
                            visited[nx][ny][cur.rest - 1] = true;
代码语言:txt
复制
                        }
代码语言:txt
复制
                    }
代码语言:txt
复制
                }
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
        return -1;
代码语言:txt
复制
    }
代码语言:txt
复制
};

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、二叉树中序遍历
  • 二、二叉树层序遍历
  • 三、翻转二叉树
  • 四、反转链表
  • 五、岛屿数量
  • 六、买卖股票的最佳时机
  • 七、全排列
  • 八、比较版本号
  • 九、验证IPV4
  • 十、目标和
  • 十一、网格最短路径
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档