Combinations

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],

]
Solution:
采用位运算来做,但是这样时间复杂度很高O(n* 2^ n)。
 1 public class Solution {

 2     public ArrayList<ArrayList<Integer>> combine(int n, int k) {

 3         // Start typing your Java solution below

 4         // DO NOT write main() function

 5         ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();

 6         for(int i = 0; i < Math.pow(2,n); i ++){

 7             ArrayList<Integer> row = new ArrayList<Integer>();

 8             for(int j = 0; j < n; j ++){

 9                 if((i >> j & 1)  == 1){

10                     row.add(j + 1);

11                 } 

12             }

13             if(row.size() == k)

14                 result.add(row);

15         }

16         return result;

17     }

18 }

 第二遍: 使用递归。过不了大循环。

 1 public class Solution {

 2     ArrayList<ArrayList<Integer>> result = null;

 3     public ArrayList<ArrayList<Integer>> combine(int n, int k) {

 4         // Start typing your Java solution below

 5         // DO NOT write main() function

 6         result = new ArrayList<ArrayList<Integer>>();

 7         boolean[] map = new boolean[n];

 8         getAnswer(map, new ArrayList<Integer>(), k);

 9         return result;

10     }

11     public void getAnswer(boolean[] map, ArrayList<Integer> row, int n){

12         if(n == 0) result.add(row);

13         for(int i = 0; i < map.length; i ++){

14             if(!map[i]){

15                 map[i] = true;

16                 row.add(i + 1);

17                 getAnswer(map, row, n - 1);

18                 map[i] = false;

19             }

20         }

21     }

22 }

 

你可能感兴趣的:(com)