• LeetCode题解(三)


    LeetCode题解(三)

    Merge Sorted Array

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

    Note:
    You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.

    void merge(int* nums1, int m, int* nums2, int n) {
        int k = m + n - 1;
        m -= 1;
        n -= 1;
        while (k >= 0) {
            if (n < 0 || (m >= 0 && nums1[m] > nums2[n]))
                nums1[k--] = nums1[m--];
            else
                nums1[k--] = nums2[n--];
        }
    }

    Same Tree

    Given two binary trees, write a function to check if they are equal or not.

    Two binary trees are considered equal if they are structurally identical and the nodes have the same value.

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
        if (!p && !q)
            return true;
        if (!p || !q)
            return false;
        return p->val == q->val && isSameTree(p->left, q->left) &&
            isSameTree(p->right, q->right);
    }

    Symmetric Tree

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

    For example, this binary tree is symmetric:

    1
    /
    2 2
    / /
    3 4 4 3
    But the following is not:
    1
    /
    2 2

    3 3
    Note:
    Bonus points if you could solve it both recursively and iteratively.

    confused what “{1,#,2,3}” means? > read more on how binary tree is serialized on OJ.

    OJ’s Binary Tree Serialization:
    The serialization of a binary tree follows a level order traversal, where ‘#’ signifies a path terminator where no node exists below.

    Here’s an example:
    1
    /
    2 3
    /
    4

    5
    The above binary tree is serialized as “{1,2,3,#,#,4,#,#,5}”.

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    
     static bool is_sym(struct TreeNode* left, struct TreeNode* right) {
        if (!left && !right)
            return true;
        if (!left || !right)
            return false;
        if (left->val != right->val)
            return false;
    
        if(!is_sym(left->left, right->right))
            return false;
        if (!is_sym(left->right, right->left))
            return false;
    
        return true;
    }
    
    bool isSymmetric(struct TreeNode* root) {
        if (!root)
            return true;
        return is_sym(root->left, root->right);
    }

    Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).

    For example:
    Given binary tree {3,9,20,#,#,15,7},
    3
    /
    9 20
    /
    15 7
    return its level order traversal as:
    [
    [3],
    [9,20],
    [15,7]
    ]
    confused what “{1,#,2,3}” means? > read more on how binary tree is serialized on OJ.

    OJ’s Binary Tree Serialization:
    The serialization of a binary tree follows a level order traversal, where ‘#’ signifies a path terminator where no node exists below.

    Here’s an example:
    1
    /
    2 3
    /
    4

    5
    The above binary tree is serialized as “{1,2,3,#,#,4,#,#,5}”.

    #define ELE_NUM 10000
    
    typedef struct Ele {
        int val;
        int level;
    } Ele;
    
    typedef struct TreeNode TreeNode;
    
    static void tree2arr(TreeNode* node, Ele* ele, int level,
                         int* global_index, int* total_level, int* col_size) {
        if (!node)
            return;
        (ele + *global_index)->val = node->val;
        (ele + *global_index)->level = level;
        ++(*global_index);
        ++(*(col_size + level));
        if (level > *total_level)
            *total_level = level;
        tree2arr(node->left, ele, level + 1, global_index, total_level, col_size);
        tree2arr(node->right, ele, level + 1, global_index, total_level, col_size);
    }
    
    /**
     * Return an array of arrays of size *returnSize.
     * The sizes of the arrays are returned as *columnSizes array.
     * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
     */
    int** levelOrder(struct TreeNode* root, int** columnSizes, int* returnSize) {
        *returnSize = 0;
        if (!root) {
            *columnSizes = NULL;
            return NULL;
        }
    
        Ele* ele = (Ele*)malloc(sizeof(Ele) * ELE_NUM);
        memset(ele, 0xff, sizeof(Ele) * ELE_NUM);
        int col_size[ELE_NUM];
        memset(col_size, 0, sizeof(int) * ELE_NUM);
        int level = 0;
        int global_index = 0;
        int total_level = 0;
    
        // 遍历一遍树,得到每个结点的值以及所在的层数
        tree2arr(root, ele, level, &global_index, &total_level, col_size);
        total_level += 1;
    
        int** result = (int**)malloc(sizeof(int*) * total_level);
        *columnSizes = (int*)malloc(sizeof(int) * total_level);
        for (int i = 0; i < total_level; ++i) {
            *(result + i) = (int*)malloc(sizeof(int) * col_size[i]);
            *(*columnSizes + i) = 0;
        }
    
        for (int i = 0; i < global_index; ++i) {
            level = (ele + i)->level;
            *(*(result + level) + *(*columnSizes + level)) = (ele + i)->val;
            *(*columnSizes + level) += 1;
        }
        *returnSize = total_level;
    
        free(ele);
    
        return result;
    }

    Maximum Depth of Binary Tree

    Given a binary tree, find its maximum depth.

    The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.

    static void max_depth(struct TreeNode* node, int level, int* depth) {
        if (!node)
            return;
    
        if (level > *depth)
            *depth = level;
    
        max_depth(node->left, level + 1, depth);
        max_depth(node->right, level + 1, depth);
    }
    
    
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    int maxDepth(struct TreeNode* root) {
        int depth = 0;
        max_depth(root, 1, &depth);
        return depth;
    }

    Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes’ values. (ie, from left to right, level by level from leaf to root).

    For example:
    Given binary tree {3,9,20,#,#,15,7},
    3
    /
    9 20
    /
    15 7
    return its bottom-up level order traversal as:
    [
    [15,7],
    [9,20],
    [3]
    ]

    求测试,以下代码本地测试通过,但是LeetCode运行时错误。上面此题的正序代码可能也隐藏有BUG。
    标记:先放在这了,以后再找BUG。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    
    #define ELE_NUM 10000
    
    typedef struct Ele {
        int val;
        int level;
    } Ele;
    
    typedef struct TreeNode TreeNode;
    
    static void tree2arr(TreeNode* node, Ele* ele, int level,
                         int* global_index, int* total_level, int* col_size) {
        if (!node)
            return;
        (ele + *global_index)->val = node->val;
        (ele + *global_index)->level = level;
        ++(*global_index);
        ++(*(col_size + level));
        if (level > *total_level)
            *total_level = level;
        tree2arr(node->left, ele, level + 1, global_index, total_level, col_size);
        tree2arr(node->right, ele, level + 1, global_index, total_level, col_size);
    }
    
    /**
     * Return an array of arrays of size *returnSize.
     * The sizes of the arrays are returned as *columnSizes array.
     * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
     */
    int** levelOrderBottom(struct TreeNode* root, int** columnSizes, int* returnSize) {
        *returnSize = 0;
        if (!root) {
            *columnSizes = NULL;
            return NULL;
        }
    
        Ele* ele = (Ele*)malloc(sizeof(Ele) * ELE_NUM);
        memset(ele, 0xff, sizeof(Ele) * ELE_NUM);
        int col_size[ELE_NUM];
        memset(col_size, 0, sizeof(int) * ELE_NUM);
        int level = 0;
        int global_index = 0;
        int total_level = 0;
    
        // 遍历一遍树,得到每个结点的值以及所在的层数
        tree2arr(root, ele, level, &global_index, &total_level, col_size);
        total_level += 1;
    
        int** result = (int**)malloc(sizeof(int*) * total_level);
        *columnSizes = (int*)malloc(sizeof(int) * total_level);
        for (int i = 0; i < total_level; ++i) {
            *(result + i) = (int*)malloc(sizeof(int) * col_size[i]);
            *(*columnSizes + i) = 0;
        }
    
        for (int i = 0; i < global_index; ++i) {
            level = total_level - (ele+i)->level - 1;
            *(*(result + level) + *(*columnSizes + level)) = (ele + i)->val;
            *(*columnSizes + level) += 1;
        }
        *returnSize = total_level;
    
        free(ele);
    
        return result;
    }

    Balanced Binary Tree

    Given a binary tree, determine if it is height-balanced.

    For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    
    static int diff(struct TreeNode* node) {
        if (!node)
            return 0;
        int left_height = diff(node->left);
        if (left_height == -1)
            return -1;
        int right_height = diff(node->right);
        if (right_height == -1)
            return -1;
    
        int d = left_height > right_height ? left_height - right_height : right_height - left_height;
        if (d > 1)
            return -1;
        else
            return d = (left_height > right_height) ? left_height + 1 : right_height + 1;
    }
    
    
    bool isBalanced(struct TreeNode* root) {
        if (!root)
            return true;
        int d = diff(root);
        if (d == -1)
            return false;
        else
            return true;
    }

    Minimum Depth of Binary Tree

    Given a binary tree, find its minimum depth.

    The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    int minDepth(struct TreeNode* root) {
        if (!root)
            return 0;
    
        int left_height = minDepth(root->left);
        int right_height = minDepth(root->right);
        if (!left_height && !right_height)
            return 1;
    
        if (!left_height)
            left_height = INT_MAX;
        if (!right_height)
            right_height = INT_MAX;
    
        return left_height < right_height ? left_height + 1 : right_height + 1;
    }

    Path Sum

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

    For example:
    Given the below binary tree and sum = 22,
    5
    /
    4 8
    / /
    11 13 4
    /
    7 2 1
    return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    
    static bool path_sum(struct TreeNode* node, int sub_sum, int sum) {
        if (!node)
            return false;
    
        sub_sum += node->val;
        if (!node->left && !node->right) {
            if (sub_sum == sum)
                return true;
            else 
                return false;
        } else {
            return path_sum(node->left, sub_sum, sum) || 
                path_sum(node->right, sub_sum, sum);
        }
    }
    
    bool hasPathSum(struct TreeNode* root, int sum) {
        return path_sum(root, 0, sum);
    }

    Pascal’s Triangle

    Given numRows, generate the first numRows of Pascal’s triangle.

    For example, given numRows = 5,
    Return

    [
    [1],
    [1,1],
    [1,2,1],
    [1,3,3,1],
    [1,4,6,4,1]
    ]

    /**
     * Return an array of arrays.
     * The sizes of the arrays are returned as *columnSizes array.
     * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
     */
    int** generate(int numRows, int** columnSizes) {
        if (!numRows) {
            *columnSizes = NULL;
            return NULL;
        }
    
        int** result = (int**)malloc(sizeof(int*) * numRows);
        *columnSizes = (int*)malloc(sizeof(int) * numRows);
        *result = (int*)malloc(sizeof(int));
        **result = 1; **columnSizes = 1;
        for (int i = 1; i < numRows; ++i) {
            *(*columnSizes + i) = 0;
            *(result + i) = (int*)malloc(sizeof(int) * (i + 1));
            for (int j = 0; j < i + 1; ++j) {
                if (j == 0 || j == i)
                    *(*(result + i) + j) = 1;
                else
                    *(*(result + i) + j) = *(*(result + i - 1) + j - 1) +
                        *(*(result + i - 1) +j);
                *(*columnSizes + i) += 1;
            }
        }
    
        return result;
    }
  • 相关阅读:
    【CCF】高速公路 tarjan强连通缩点
    【hihocoder】欧拉路径 并查集判连通
    【CCF】地铁修建 改编Dijkstra
    Android仿微信朋友圈图片展示实现
    android 禁止 recycler 滑动
    android中关闭软键盘
    java Math.pow 精度丢失问题
    Centos查看端口占用情况和开启端口命令
    centos 部署 php
    php undefinde function json_decode()
  • 原文地址:https://www.cnblogs.com/corfox/p/6063310.html
Copyright © 2020-2023  润新知