77、k个数字组合

  1. 示例:
  • 代码
  • 给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。

    示例:

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

    代码

    • 递归回溯
    class Solution {
        List<List<Integer>> res = new LinkedList<List<Integer>>();
        public List<List<Integer>> combine(int n, int k) {
            // 递归回溯,深度眼优先搜索,
            LinkedList<Integer> temp = new LinkedList<Integer>();
            combine(n,k,1,temp);
            return res;
        }
        
        private void combine(int n,int k,int index,LinkedList<Integer> temp){
            if (temp.size() == k) {
                res.add(new LinkedList<Integer>(temp));
                return;// 可以不返回
            }
            for (int i = index;i <= n;i++) {
                temp.add(i);
                combine(n,k,i+1,temp);
                temp.removeLast();
            }
        }
    }
    // 官网解答 
    class Solution {
      List<List<Integer>> output = new LinkedList();
      int n;
      int k;
    
      public void backtrack(int first, LinkedList<Integer> curr) {
        // if the combination is done
        if (curr.size() == k)
          output.add(new LinkedList(curr));
    
        for (int i = first; i < n + 1; ++i) {
          // add i into the current combination
          curr.add(i);
          // use next integers to complete the combination
          backtrack(i + 1, curr);
          // backtrack
          curr.removeLast();
        }
      }
    
      public List<List<Integer>> combine(int n, int k) {
        this.n = n;
        this.k = k;
        backtrack(1, new LinkedList<Integer>());
        return output;
      }
    }
    
    // 作者:LeetCode
    // 链接:https://leetcode-cn.com/problems/combinations/solution/zu-he-by-leetcode/
    // 来源:力扣(LeetCode)
    // 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 字典序列组合
    class Solution {
      public List<List<Integer>> combine(int n,int k) {
        // 初始化字典数组
        LinkedList<Integer> nums = new LinkedList<Integer>();
        for (int i = 1;i < k + 1;++i) {
          nums.add(i);
        }
        nums.add(n+1);// 哨兵
    
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        int j = 0;
        while(j < k) {
          // 获取满足要求的子组合
          res.add(new LinkedList(nums,subList(0,k)));
          j = 0;
          // 循环判断是否都连续
          while ((j < k) && (nums.get(j + 1) == nums.get(j) + 1)){
            nums.set(j,j++ + 1);// 更改响应位置的数字 较快
          }
          nums.set(j, nums.get(j) + 1);// 更换开始数字
        }
        return res;
      }
    }
    

    转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com

    💰

    Title:77、k个数字组合

    Count:500

    Author:攀登

    Created At:2020-07-26, 00:19:44

    Updated At:2024-06-15, 15:52:32

    Url:http://jiafeimao-gjf.github.io/2020/07/26/77%E3%80%81k%E4%B8%AA%E6%95%B0%E5%AD%97%E7%BB%84%E5%90%88/

    Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.

    ×

    Help us with donation