leetcode216组合总和III

leetcode216 Combination Sum III

Posted by BY on June 28, 2019

前言

新的一年,好好学习。

正文

问题来源

本问题来自leetcode上的216题。

问题描述

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]

示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

分析:

func min(a, b int) int{
    if a < b {
        return a
    }
    return b
}

func combinationSum3(k int, n int) [][]int {
    tmp := make([]int, 0)
    res := make([][]int, 0)
    dfs(k, n, tmp, &res)
    return res
}

func dfs(k int, n int, tmp []int, res *[][]int) {
    
    l := len(tmp)
    if n < 0 {
        return
    }
    if l == k-1 {
        if l >= 1 {
            if n > tmp[l-1] && n <= 9 {
                //
                tmp = append(tmp, n)
                t := make([]int, k)
                copy(t, tmp)
                *res = append(*res, t)
                return
            }
            return
        }
        //
        if n > 9 {
            return
        }
        tmp = append(tmp, n)
        t := make([]int, k)
        copy(t, tmp)
        *res = append(*res, t)
        return
    }
    var i int
    if l == 0 {
        i = 1
    } else {
        i = tmp[l-1] + 1
    }
    end := min(n/(k-l) - (k-l-1)/2 + 1, 9)
    for ; i <= end; i++ {
        dfs(k, n-i, append(tmp, i), res)
    }
}

感觉自己写的不是很好,找到了一个C++的代码,没有优化,便于读者看懂

class Solution {
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        vector<vector<int>> v;
        vector<int> vec;
        combination(v, vec, k, n, 1);
        return v;
    }

    void combination(vector<vector<int>>& v, vector<int>& vec, int k, int n, int start) {
        if (vec.size() == k && n == 0) {
            v.push_back(vec);
            return;
        }
        for (int i = start; i <= 9; i++) {
            vec.push_back(i);
            combination(v, vec, k, n - i, i + 1);
            vec.pop_back();
        }
    }
};

总结:

勤思考。

结语

不管怎么样好好加油。