【LeetCode】HOT 100(24)

题单介绍:

精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。

目录

题单介绍:

题目:437. 路径总和 III - 力扣(Leetcode)

题目的接口:

解题思路:

代码:

过过过过啦!!!!

题目:416. 分割等和子集 - 力扣(Leetcode)

题目的接口:

解题思路:

代码:

过过过过啦!!!!

写在最后:


题目:437. 路径总和 III - 力扣(Leetcode)

题目的接口:

/**
 * 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 pathSum(TreeNode* root, int targetSum) {

    }
};

解题思路:

这道题的做法,我就是直接使用深度优先搜索,

然后通过rootSum函数查找路径和,

通过重复调用pathSum自身来查找不同根节点的路径和,

核心在于通过每次调用rootSum的时候减少targetSum的方式完成路径求和。

代码如下:

代码:

/**
 * 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:
    long pathSum(TreeNode* root, long targetSum) {
        if(root == nullptr) return 0;
        long ret = rootSum(root, targetSum);
        ret += pathSum(root->left, targetSum);
        ret += pathSum(root->right, targetSum);
        return ret;
    }
    
private:
    long rootSum(TreeNode* root, long targetSum) {
        if(root == nullptr) return 0;
        long ret = 0;
        if(root->val == targetSum) ret++;
        ret += rootSum(root->left, targetSum - root->val);
        ret += rootSum(root->right, targetSum - root->val);
        return ret;
    }
};

过过过过啦!!!!

题目:416. 分割等和子集 - 力扣(Leetcode)

题目的接口:

class Solution {
public:
    bool canPartition(vector<int>& nums) {

    }
};

解题思路:

这道题的正统解法应该是动态规划,

但是我不会动态规划,然后我就在讨论区看到了一个另类的解法,

具体思路是这样的:

因为是分成两个子集,且都是整数,所以他们的和其实就是总和的一半,

把所有相加的情况都跟总和的一半作比较,然后就能得出能否分成两个子集了,

代码如下:

代码:

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        for(auto e : nums) sum += e;
        if(sum % 2 != 0) return false;
        int target = sum / 2;
        set<int> st;
        for(int i = 0; i < nums.size(); i++) {
            set<int> snum;
            if(nums[i] == target) return true;
            if(nums[i] < target) snum.insert(nums[i]);
            for(auto num : st) {
                int tarSum = nums[i] + num;
                if(tarSum == target) return true;
                if(tarSum < target) snum.insert(tarSum);
            }
            for(auto k : snum) st.insert(k);
        }
        return false;
    }
};

过过过过啦!!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

猜你喜欢

转载自blog.csdn.net/Locky136/article/details/131394528
今日推荐