LeetCode 力扣 刷题记录 热题 HOT 100(78,79,94,96,98)题目+算法分析+Cpp解答

78.Subsets

回溯法:

class Solution {
public:
    vector<vector<int>> ans;
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<int> temp;
        backtrack(0, temp, nums);
        return ans;
    }
    void backtrack(int pos, vector<int> temp, vector<int>& nums){
        ans.push_back(temp);
        for(int i=pos; i<nums.size(); i++){
            temp.push_back(nums[i]);
            backtrack(i+1, temp, nums);
            temp.pop_back();
        }
        return;
    }
};

枚举法:

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ans;
        vector<int> temp;
        int len = nums.size();
        ans.push_back(temp);
        for(int i=0; i<len; i++){
            int anslen = ans.size();
            for(int j=0; j<anslen; j++){
                temp = ans[j];
                temp.push_back(nums[i]);
                ans.push_back(temp);
            }
        }
        return ans;
    }
};

前序遍历:

class Solution {
public:
    vector<vector<int>> ans;
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<int> temp;
        preorder(0, temp, nums);
        return ans;
    }
    void preorder(int pos, vector<int> temp, vector<int>& nums){
        if(pos >= nums.size()){
            ans.push_back(temp);
            return;
        }       
        preorder(pos+1, temp, nums);
        temp.push_back(nums[pos]);
        preorder(pos+1, temp, nums);
    }
};

79.Word Search

深度优先搜索 DFS + 回溯法:

​ 很好理解的回溯法,对就继续走下去,不对就回到之前的状态另找一条路走。

​ 根据题目的意思按照题目的走路方式写代码就对了。

​ 代码长了点,因为是完全按照 DFS 时可能遇到的各种情况进行分类讨论了。

class Solution {
public:
    bool ans = false;
    vector<vector<int>> use;
    bool exist(vector<vector<char>>& board, string word) {
        for(int i = 0; i < board.size(); i++){
            vector<int> temp;
            use.push_back(temp);
            for(int j = 0; j < board[i].size(); j++){
                use[i].push_back(0);
            }
        }
        backtrack(0, 0, 0, board, word);
        return ans;
    }
    void backtrack(int num, int pos1, int pos2, vector<vector<char>>& board, string word){
        if(ans)
            return;
        else if(num >= word.length()){
            ans = true;
            return;
        }
        else if(num == 0){
            for(int i = 0; i < board.size(); i++){
                for(int j = 0; j < board[i].size(); j++){
                    if(board[i][j] == word[0]){
                        use[i][j] = 1;
                        backtrack(1, i, j, board, word);
                        use[i][j] = 0;
                    }
                }
            }
        }
        else{
            if(pos1 > 0 && board[pos1-1][pos2] == word[num] && use[pos1-1][pos2] != 1){
                use[pos1-1][pos2] = 1;
                backtrack(num+1, pos1-1, pos2, board, word);
                use[pos1-1][pos2] = 0;
            }
            if(pos1 < board.size()-1 && board[pos1+1][pos2] == word[num] 
                                    && use[pos1+1][pos2] != 1){
                use[pos1+1][pos2] = 1;
                backtrack(num+1, pos1+1, pos2, board, word);
                use[pos1+1][pos2] = 0;
            }
            if(pos2 > 0 && board[pos1][pos2-1] == word[num] && use[pos1][pos2-1] != 1){
                use[pos1][pos2-1] = 1;
                backtrack(num+1, pos1, pos2-1, board, word);
                use[pos1][pos2-1] = 0;
            }
            if(pos2 < board[pos1].size()-1 && board[pos1][pos2+1] == word[num] 
                                    && use[pos1][pos2+1] != 1){
                use[pos1][pos2+1] = 1;
                backtrack(num+1, pos1, pos2+1, board, word);
                use[pos1][pos2+1] = 0;
            }
        }
        return;
    }
};

94.Binary Tree Inorder Traversal

二叉树的中序遍历:

​ 送分题。

/**
 * 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:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        inorder(root, ans);
        return ans;
    }
    void inorder(TreeNode* root, vector<int>& ans){
        if(root == NULL)
            return;
        inorder(root->left, ans);
        ans.push_back(root->val);
        inorder(root->right, ans);
    }
};

96.Unique Binary Search Trees

数学题 + 记录 + 相乘 + 相加:

​ 记录下从 0 到 n 之间的各个数 所可能构造出来的二叉查找树(二叉搜索树)的个数。

​ 记录下来的原因是:之后的二叉查找树个数计算会用到之前的结果。

class Solution {
public:
    int numTrees(int n) {
        long table[1000];
        table[0] = 1;
        table[1] = 1;
        for(int i=2; i<=n; i++){
            table[i] = 0;
            for(int j=1; j<=i; j++){
                table[i] += (table[j-1] * table[i-j]);
            }
        }
        return table[n];
    }
};

98.Validate Binary Search Tree

关于二叉查找树的中序遍历:

​ 根据二叉查找树的性质,对二叉查找树进行中序遍历可以得到一个有序的序列。

​ 通过判断进行中序遍历得到的序列是否严格有序,可以得知这个二叉查找树是否正确(有效)。

/**
 * 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:
    bool isValidBST(TreeNode* root) {
        vector<int> nums;
        inorder(root, nums);
        int len = nums.size();
        for(int i=1; i<len; i++){
            if(nums[i] <= nums[i-1])
                return false;
        }
        return true;
    }
    void inorder(TreeNode* root, vector<int>& nums){
        if(root == NULL)
            return;
        inorder(root->left, nums);
        nums.push_back(root->val);
        inorder(root->right, nums);
    }
};
发布了36 篇原创文章 · 获赞 5 · 访问量 5230

猜你喜欢

转载自blog.csdn.net/qq_43413123/article/details/105443940
今日推荐