LeetCode ---- 77、组合

题目链接

思路:

组合的问题,以及排列的问题,都可以用回溯法解决,这种题目见多了也就知道怎么做了。

对于每一个数字,每一次都从这个数字往后找,找够k个数字,添加到最终的结果集合中

每一次添加完成之后,需要将当前组合中最后添加进来的数字移除掉,然后从这个数字后一个数字开始重新找

最终以每一个数字为开头寻找结束之后,返回结果

    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> ans = new ArrayList<>();
        if (n <= 0 || k <= 0 || k > n) {
            return ans;
        }
        // 当前从0开始,进行DFS深度优先搜索
        dfs(n, k, 0, 0, new ArrayDeque<Integer>(), ans);
        return ans;
    }
    /**
     * 
     * @param n   题目给的n个数字
     * @param k   题目给的组合数
     * @param cur  当前数字
     * @param depth  已经组合的数字的个数
     * @param path   记录当前组合
     * @param ans    记录最终答案
     */
    private void dfs(int n, int k, int cur, int depth,
                                 Deque<Integer> path, List<List<Integer>> ans) {
        // 当已经组合的数字个数等于 k 时,需要将此结果加入到最终结果中
        if (depth == k) {
            ans.add(new ArrayList(path));
            return;
        }
        // 由于从1开始,所以0位置不用
        for (int i = cur + 1; i <= n; i++) {
            // 将当前数字作为备选
            path.push(i);
            // 开始尝试下一个数
            dfs(n, k, i, depth + 1, path, ans);
            // 将当前数字从备选中移除
            path.pop();
        }
    }

猜你喜欢

转载自blog.csdn.net/sinat_34679453/article/details/106975404
今日推荐