Description
Given two integers n and k, return all possible combinations of k numbers out of 1 … n.
You may return the answer in any order.
Examples
Example 1:
Input: n = 4, k = 2
Output:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
Example 2:
Input: n = 1, k = 1
Output: [[1]]
Constraints:
1 <= n <= 20
1 <= k <= n
解题思路
这个不太好解释,因为这份代码虽然空间很节省,但是运行的很慢很慢很慢,主要思想就是深搜,具体怎么搜就各有各的想法了hhhhh
可以优化的空间在于怎么让数据不要重复,应该是可以通过pos标志进行的,而不用每次都遍历,但还没有想到实现方式orz
代码
class Solution {
public List<List<Integer>> answer;
public void concat(int k, List<Integer> now, List<Integer> rest){
int i;
Collections.sort(now);
if(now.size() > 0){
int max = now.get(now.size() - 1);
Iterator<Integer> it = rest.iterator();
while(it.hasNext()){
Integer num = it.next();
if(num < max){
it.remove();
}
}
}
if(k == 1){
for(i = 0; i < rest.size(); i++){
List<Integer> temp = new ArrayList<>(now);
temp.add(rest.get(i));
answer.add(new ArrayList<>(temp));
}
return;
}
for(i = 0; i < rest.size(); i++){
Integer temp = rest.get(i);
now.add(temp);
rest.remove(temp);
concat(k - 1, new ArrayList<>(now), new ArrayList<>(rest));
rest.add(i, temp);
now.remove(temp);
}
}
public List<List<Integer>> combine(int n, int k) {
answer = new ArrayList<>();
List<Integer> number = new ArrayList<>();
List<Integer> rest = new ArrayList<>();
int i;
for(i = 1; i <= n; i++)
rest.add(i);
concat(k, number, rest);
return answer;
}
}