iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
自我挑戰組

LeetCode 自我修煉馬拉松系列 第 20

Day20: Easy 40-41

  • 分享至 

  • xImage
  •  

今天的題單:

  • Subtree of Another Tree

  • Squares of a Sorted Array

572. Subtree of Another Tree

思路:在 binary tree 中可能有很多 node 的值和 target subtree 的 node 一樣,這些 node 都可以是 sub-tree 的 root,因此作法分成兩步驟:

  1. 找出所有可能的 root

  2. 一個一個檢查以此 node 形成的 subtree 是不是跟 target subtree 相同,只要有一個是就返回 true

/**
 * 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:
    bool isSubtree(TreeNode* root, TreeNode* subRoot) {
        TreeNode* head = nullptr;
        stack<TreeNode*> stk;

        // find all the possible roots in the tree
        findSubtreeRoot(root, subRoot->val, stk);
        
        // Check the all possible sub-tree
        while (!stk.empty()) {
            if (sameTree(stk.top(), subRoot)) {
                return true;
            }
            stk.pop();
        }
        return false;
    }

    void findSubtreeRoot(TreeNode* root, int target, stack<TreeNode*>& stk) {
        // DFS
        if (root == nullptr) return;
        if (root->val == target) {
            stk.push(root);
        }
        findSubtreeRoot(root->left, target, stk);
        findSubtreeRoot(root->right, target, stk);
    }

    bool sameTree(TreeNode* root1, TreeNode* root2) {
        if (root1 == nullptr && root2 == nullptr)
            return true;
        if (root1 == nullptr || root2 == nullptr)
            return false;
        return root1->val == root2->val && sameTree(root1->left, root2->left) && sameTree(root1->right, root2->right);
    }
};

977. Squares of a Sorted Array

思路:找到非負整數的分界線,把 list 分成兩半,應用 merge sort 的方式把數字的平方排序到新的陣列裡,此方法是 O(n) time。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> sorted_nums;

        int i = 0;
        int j = 0;

        while (j < nums.size() && nums[j] < 0) {
            j++;
        }

        i = j - 1;

        while (i >= 0 || j < nums.size()) {
            if (i < 0) {
                sorted_nums.push_back(nums[j] * nums[j]);
                j++;
            } else if (j >= nums.size()) {
                sorted_nums.push_back(nums[i] * nums[i]);
                i--;
            } else {
                if (abs(nums[i]) < abs(nums[j])) {
                    sorted_nums.push_back(nums[i] * nums[i]);
                    i--;
                } else {
                    sorted_nums.push_back(nums[j] * nums[j]);
                    j++;
                }
            }
        }

        return sorted_nums;
    }
};

上一篇
Day19: Easy 38-39
下一篇
Day21: Medium 42-43
系列文
LeetCode 自我修煉馬拉松30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言