leetcode 216.组合总和III

day25

又做出来题目了!!夸!

思路和之前差不多,无非就是求个和,不过我这里求和做复杂了。还多用了个循环。其实可以在下面的循环中就可以求。

我剪枝也没想到。。。。。。。

一个是没想到 和大于了之后可以直接剪,

二刷的心得:

终止条件的时候,如果是path.size() == k && sum == n 这样的话,

就需要多加一个终止条件  sum > n  return

因为上面两个条件有可能不能同时满足,所以需要多加一个判断。

如果分开写,先判断path.size() == k,再判断sum == n,就没事。因为第一个必定会被满足。

if( sum > n)
    return;

二一个是 对上一题  77 题的组合,剪枝理解得不够深入!

i <= 9 + 1 - (k - path.size())

这里 i 的取值都是意味着一个区间的最左边!如图:

class Solution {
public:

    vector<int> path;
    vector<vector<int>> res;
    void backtracking(int k, int n,int startIndex)
    {   
        int sum = 0;
        for(int a : path)
        {
            sum += a;
        }
        if(sum > n)       // 剪枝 
            return;
        if(sum == n && path.size() == k)
        {
            res.push_back(path);
            return ;
        }

        for(int i = startIndex; i <= 9 + 1 - (k - path.size()) ; i++ )   // 可以如何剪枝呢?
        {
            path.push_back(i);
            backtracking(k ,n ,i + 1);
            path.pop_back();
        }
        return;
    }

    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(k , n ,1);

        return res;
    }
};

再来一遍看题解之后的修改!

class Solution {
public:

    vector<int> path;
    vector<vector<int>> res;
    int sum;
    void backtracking(int k, int n, int startIndex)
    {
        
        if( sum > n)
            return;

        if(sum == n && path.size() == k)
        {
            res.push_back(path);
            return;
      
        }

        for(int i = startIndex; i <= 9 + 1 - (k - path.size()); i++)
        {
            sum += i;          // 放在这里循环里面求和
            path.push_back(i);
            backtracking(k , n , i + 1);
            sum -= i;
            path.pop_back();
        }

        return;
    }
    vector<vector<int>> combinationSum3(int k, int n) {

        backtracking(k , n ,1);
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值