478-82(56、128、718、129)

本文档详细介绍了四个编程问题的解决方案:合并不重叠区间、找到最长连续整数序列、寻找两个数组中最长重复子数组以及计算从根节点到叶节点数字之和。通过Solution类中的函数展示了如何用C++实现这些常见的算法。
摘要由CSDN通过智能技术生成

56. 合并区间

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        
        vector<vector<int>> res;

        int length = intervals.size();
        if (length == 0)  return res;

        sort(intervals.begin(), intervals.end(),
            [](const vector<int>& a, const vector<int>& b)->bool
            {
                return a[0] < b[0];
            }
        );

        int flag = false;

        for (int i = 1; i < length; i++)
        {
            int start = intervals[i - 1][0];
            int end = intervals[i - 1][1];

            while (i < length && intervals[i][0] <= end)
            {
                end = std::max(end, intervals[i][1]);
                if (i == length - 1) flag = true;
                i++;
            }
            res.push_back({ start, end });
        }
        if (flag == false)
        {
            res.push_back({ intervals[length - 1][0], intervals[length - 1][1] });
        }

        return res;
    }
};

在这里插入图片描述

128. 最长连续序列

在这里插入图片描述

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> hash;
        for (const auto& n : nums)
        {
            hash.insert(n);
        }

        int res = 0;

        for (const auto& x : hash)
        {
            if (!hash.count(x - 1))//x的前面没有数了,即找每个分段最小的
            {
                int y = x;
                while (hash.count(y + 1)) y++;
                res = std::max(res, y - x + 1);
            }
        }
        return res;
    }
};

在这里插入图片描述

718. 最长重复子数组

在这里插入图片描述

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        int m = nums1.size();
        int n = nums2.size();

        vector<vector<int>> dp(m + 1, vector<int>(n+1, 0));
        int res = 0;

        for(int i = 1; i <= m; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                if(nums1[i-1] == nums2[j-1])
                {
                    dp[i][j] = dp[i-1][j-1] + 1;
                }

                res = std::max(dp[i][j], res);
            }
        }
        return res;
    }
};

在这里插入图片描述

129. 求根节点到叶节点数字之和

在这里插入图片描述

class Solution {
public:
    int dfs(TreeNode* root, int sum)
    {
        if (root == nullptr) return 0;

        sum = 10 * sum + root->val;

        if (root->left == nullptr && root->right == nullptr)
        {
            return sum;
        }
        else
        {
            return dfs(root->left, sum) + dfs(root->right, sum);
        }
    }
public:
    int sumNumbers(TreeNode* root) {
        return dfs(root, 0);
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liufeng2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值