77-组合

77-组合

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combinations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> res = new ArrayList<>();

        if(n < k) {
            return res;
        } else if(k == 0) {
            List<Integer> zero = new ArrayList<>();
            res.add(zero);
            return res;
        }

        int[] nums = new int[n];
        for(int i = 0; i < n; i++) {
            nums[i] = i + 1;
        }

        return subsets(nums, k);
    }

    public List<List<Integer>> subsets(int[] nums, int k) {
        List<List<Integer>> res = new ArrayList<>();

        if(nums.length == 0 || nums.length < k) {
            return res;
        }

        if(k == 1) {
            for(int num : nums) {
                List<Integer> single = new ArrayList<>();
                single.add(num);
                res.add(single);
            }
            return res;
        }

        if(nums.length == k) {
            List<Integer> full = new ArrayList<>();
            for(int num : nums) {
                full.add(num);
            }
            res.add(full);
            return res;
        }

        // 递归,减治法
        res = subsets(Arrays.copyOfRange(nums, 0, nums.length - 1), k);

        List<List<Integer>> temp = subsets(Arrays.copyOfRange(nums, 0, nums.length - 1), k - 1);
        for(List<Integer> t : temp) {
            t.add(nums[nums.length - 1]);
            res.add(t);
        }

        return res;
    }

猜你喜欢

转载自www.cnblogs.com/angelica-duhurica/p/12274396.html
今日推荐