全排列
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Main {
List<List<Integer>> res = new ArrayList<>();
List<List<Integer>> permute(int[] nums){
List<Integer> options = new ArrayList<>();
if(nums == null || nums.length == 0) return res;
for (int num : nums) {
options.add(num);
}
place(new LinkedList<Integer>(),options);
return res;
}
private void place(LinkedList<Integer> path, List<Integer> options){
if(path.size() == options.size()){
res.add(new LinkedList(path)); //这里必须是new一个list,因为path是地址,内容在变化
return;
}
for (int i = 0; i < options.size(); i++) {
if(path.contains(options.get(i))){
continue;
}
path.add(options.get(i));
place(path,options); // 1 3 4 ; 1 3 4;
path.removeLast(); // 1 3 ; 1 3 4;
}
}
public static void main(String[] args) {
Main main = new Main();
main.permute(new int[]{1,3,4});
for (List<Integer> re : main.res) {
for (Integer integer : re) {
System.out.print(integer + " ");
}
System.out.println();
}
}
}
77. 组合
https://leetcode-cn.com/problems/combinations/
class Solution {
List<List<Integer>> res = new ArrayList<>();
//给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合
public List<List<Integer>> combine(int n, int k) {
int[] chooses = new int[n];
for (int i = 0; i < chooses.length; i++) {
chooses[i] = i + 1;
}
System.out.println(Arrays.toString(chooses));
place(chooses,0 ,k,new ArrayList<Integer>());
return res;
}
//给当前选择
private void place(int[] chooses,int index ,int k,ArrayList<Integer> path){
if(path.size() == k){
res.add(new ArrayList<Integer>(path));
return;
}
for (int i = index; i < chooses.length; i++) {
//当前元素的选择
path.add(chooses[i]);
//下一个元素的选择
place(chooses,i+1,k,path);
//
path.remove(path.size() - 1);
}
}
}