leetcode 216. Combination Sum III DFS + 按照index递归遍历

来源:互联网 发布:电脑看片有什么软件 编辑:程序博客网 时间:2024/06/06 02:08

Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.

Example 1:

Input: k = 3, n = 7

Output:

[[1,2,4]]

Example 2:

Input: k = 3, n = 9

Output:

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

一个典型的DFS深度优先遍历,是一个很经典的问题。

要和这道题leetcode 39. Combination Sum DFS深度优先搜索 和这道题leetcode 40. Combination Sum II DFS深度优先搜索 当到一起学习。

代码如下:

import java.util.ArrayList;import java.util.List;/* * 类似全排列的问题 * */public class Solution {    List<List<Integer>> res=new ArrayList<>();    public List<List<Integer>> combinationSum3(int k, int n)     {        List<Integer> one=new ArrayList<>();        if(k<=0 || n<=0)            return res;        getAll(1,k,n,0,one);        return res;    }    private void getAll(int level,int k, int n,int sum,List<Integer> one)    {        if(k==0 && sum==n)            res.add(new ArrayList<>(one));        else if(k==0 || sum>n)            return;        else         {            for(int i=level;i<=9;i++)            {                one.add(i);                getAll(i+1, k-1, n, sum+i, one);                one.remove(one.size()-1);            }        }    }}

下面是C++的做法,就是做一个DFS深度优先遍历,注意递归出口条件的判断的先后顺序

代码如下:

#include <iostream>#include <vector>#include <queue>#include <stack>#include <string>#include <set>#include <map>#include <algorithm>using namespace std;class Solution {public:    vector<vector<int>> res;    vector<vector<int>> combinationSum3(int k, int n)     {        if (k <= 0 || n <= 0)            return res;        getAll(1, k, n, 0, vector<int>());        return res;    }    void getAll(int level, int k, int n, int sum, vector<int> one)    {        if (k == 0 && sum == n)            res.push_back(one);        else if (k == 0 || sum > n)            return;        else        {            for (int i = level; i <= 9; i++)            {                one.push_back(i);                getAll(i + 1, k - 1, n, sum + i, one);                one.erase(one.end() - 1);            }        }    }};