代码随想录算法训练营Day37 | 738.单调递增的数字,968.监控二叉树,总结 | Day 7 复习

738.单调递增的数字

文章链接  |  题目链接  |  视频链接

C++解法

暴力解法

class Solution {
public:
    bool monotone(int num){
        int max = 10;
        while (num) {
            int t = num % 10;
            if (max >= t) max = t;
            else return false;
            num = num / 10;
        }
        return true;
    }
    int monotoneIncreasingDigits(int n) {
        for (int i = n; i > 0; i--){
            if (monotone(i)){
                return i;
            }
        }
        return 0;
    }
};

贪心算法

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string strNum = to_string(n);
        int flag = strNum.size();
        for (int i = strNum.size()-1; i > 0; i--){
            if (strNum[i] < strNum[i-1]){
                flag = i;
                strNum[i-1]--;
            }
        }
        for (int i = flag; i < strNum.size(); i++){
            strNum[i] = '9';
        }
        return stoi(strNum);
    }
};

Python解法

class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        strNum = list(str(n))
        for i in range(len(strNum) - 1, 0, -1):
            if strNum[i - 1] > strNum[i]:
                strNum[i - 1] = str(int(strNum[i - 1]) - 1)
                for j in range(i, len(strNum)):
                    strNum[j] = '9'
        return int(''.join(strNum))

968.监控二叉树

文章链接  |  题目链接  |  视频链接

C++解法

/**
 * 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:
    int result;
    int traverse(TreeNode* curr){
        if (curr == nullptr){
            return 2;
        }
        int left = traverse(curr->left);
        int right = traverse(curr->right);
        if (left == 2 && right == 2){
            return 0;
        } else if (left == 0 || right == 0){
            result++;
            return 1;
        } else {
            return 2;
        }
    }
    int minCameraCover(TreeNode* root) {
        result = 0;
        if (traverse(root) == 0){
            result++;
        }
        return result;
    }
};

Python解法

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def traverse(self, result: List[int], root: Optional[TreeNode]) -> int:
        if root is None:
            return 2
        left = self.traverse(result, root.left)
        right = self.traverse(result, root.right)
        if left == 2 and right == 2:
            return 0
        elif left == 0 or right == 0:
            result[0] += 1
            return 1
        else:
            return 2
        
    def minCameraCover(self, root: Optional[TreeNode]) -> int:
        result = [0]
        if self.traverse(result, root) == 0:
            result[0] += 1
        return result[0]

总结

文章链接

Day 7 复习

454.四数相加II

class Solution {
public:
    int fourSumCount(vector& nums1, vector& nums2, vector& nums3, vector& nums4) {
        unordered_map umap;
        int result = 0;
        for (int a : nums1){
            for (int b : nums2){
                umap[a+b]++;
            }
        }
        for (int c : nums3){
            for (int d : nums4){
                if (umap.find(0 - (c+d)) != umap.end()){
                    result += umap[0 - (c+d)];
                }
            }
        }
        return result;
    }
};

383. 赎金信

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        unordered_map umap;
        for (char letter : magazine){
            umap[letter]++;
        }
        for (char letter : ransomNote){
            if (umap[letter] > 0){
                umap[letter]--;
            } else {
                return false;
            }
        }
        return true;
    }
};

15. 三数之和

class Solution {
public:
    vector> threeSum(vector& nums) {
        vector> result;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < nums.size(); i++){
            if (nums[i] > 0){
                return result;
            }
            if (i > 0 && nums[i] == nums[i-1]){
                continue;
            }
            int left = i+1;
            int right = nums.size() - 1;
            while (right > left){
                if (nums[i] + nums[left] + nums[right] > 0) right--;
                else if (nums[i] + nums[left] + nums[right] < 0) left++;
                else {
                    result.push_back(vector{nums[i], nums[left], nums[right]});
                    while (right > left && nums[right] == nums[right-1]){
                        right--;
                    }
                    while (right > left && nums[left] == nums[left+1]){
                        left++;
                    }
                    right--;
                    left++;
                }
            }
        }
        return result;
    }
};

18. 四数之和

class Solution {
public:
    vector> fourSum(vector& nums, int target) {
        vector> result;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < nums.size(); i++){
            if (nums[i] > target && nums[i] >= 0){
                break;
            }
            if (i > 0 && nums[i] == nums[i-1]){
                continue;
            }
            for (int j = i + 1; j < nums.size(); j++){
                if (nums[i] + nums[j] > target && nums[i] + nums[j] >= 0) {
                    break;
                }
                if (j > i + 1 && nums[j] == nums[j-1]){
                    continue;
                }
                int left = j + 1;
                int right = nums.size() - 1;
                while (right > left){
                    long fourSum = (long) nums[i] + nums[j] + nums[left] + nums[right];
                    if (fourSum == target){
                        result.push_back(vector{nums[i], nums[j], nums[left], nums[right]});
                        while (right > left && nums[left] == nums[left+1]){
                            left++;
                        }
                        while (right > left && nums[right] == nums[right-1]){
                            right--;
                        }
                        left++;
                        right--;
                    }
                    else if (fourSum > target){
                        right--;
                    } else {
                        left++;
                    }
                }
            }
        }
        return result;
    }

你可能感兴趣的:(代码随想录刷题训练营,算法)