zoukankan      html  css  js  c++  java
  • Combinations [LeetCode]

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

    For example,
    If n = 4 and k = 2, a solution is:

    [
      [2,4],
      [3,4],
      [2,3],
      [1,2],
      [1,3],
      [1,4],
    ]
    

      Summary: recursive functions

     1 class Solution {
     2 public:
     3     vector<vector<int> > combine(int n, int k) {
     4         vector<vector<int> > combinations;
     5         if(n == 0 || k == 0 || n < k)
     6             return combinations;
     7         if(k == 1){
     8             for(int i = 1; i <= n; i ++) {
     9                 vector<int> com(1, i);
    10                 combinations.push_back(com);
    11             }
    12             return combinations;
    13         }
    14         
    15         if(k == n){
    16             vector<int> com;
    17             for(int i = 1; i <= n; i ++) {
    18                 com.push_back(i);
    19             }
    20             combinations.push_back(com);
    21             return combinations;
    22         }
    23         
    24         if(k <= n / 2){
    25             for(int i = 0; i <= n - k; i ++){
    26                 if(i == n - k){
    27                     vector<int> com;
    28                     for(int j = n - k + 1; j <= n; j ++)
    29                         com.push_back(j);
    30                     combinations.push_back(com);
    31                     break;
    32                 }
    33                 
    34                 int pick_num = i + 1;
    35                 vector<vector<int> > sub_com = combine(n - pick_num, k - 1);
    36                 for(auto item : sub_com) {
    37                     for(int j = 0; j < item.size(); j ++){
    38                         item[j] += pick_num;                    
    39                     }
    40                     item.insert(item.begin(), pick_num);
    41                     combinations.push_back(item);
    42                 }
    43             }
    44             return combinations; 
    45         }else{
    46             combinations = combine(n, n - k);
    47             vector<vector<int> > counter_combinations;
    48             for(auto item : combinations){
    49                 vector<int> com; 
    50                 int j = 0;
    51                 for(int i = 1; i <= n ; i ++){   
    52                     if(j < item.size() && item[j] == i)
    53                         j ++;
    54                     else 
    55                         com.push_back(i);
    56                 }
    57                 counter_combinations.push_back(com);
    58             }
    59             return counter_combinations;
    60         }
    61             
    62     }
    63 };
  • 相关阅读:
    Bzoj 3624: [Apio2008]免费道路 (贪心+生成树)
    [ZJOI2008]杀蚂蚁antbuster 题解
    赛前集训的第一个小总结(希望?)
    Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)
    Luogu2150 寿司晚宴
    「考试总结2020-08-03」可期
    Luogu4747 [CERC2017]Intrinsic Interval
    BZOJ2839 集合计数
    Luogu5369 [PKUSC2018]最大前缀和
    Luogu5772 [JSOI2016]位运算
  • 原文地址:https://www.cnblogs.com/guyufei/p/3408603.html
Copyright © 2011-2022 走看看