不能偷懒?️
网址
题目
Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解法
参考 https://www.jianshu.com/p/b81da9ac9af5 图也来源于此
看到这道题觉得很简单 想了想排列是如何进行的 草稿纸上画出了这样的图 但却怎么都写不出代码 ʕノ•ᴥ•ʔノ ︵ ┻━┻
总的来说还是对递归太陌生了 自己写不出来 但看别人代码能看懂
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if(nums == null || nums.length == 0) return res;
recursiveSwap(nums, 0, res);
return res;
}
private void recursiveSwap(int[] nums, int pos, List<List<Integer>> res){
if(pos > nums.length-1){
List<Integer> temp = new ArrayList<>();
for(int i=0; i<nums.length;i++){
temp.add(nums[i]);
}
System.out.println(temp);
res.add(temp);
return;
}
for(int i=pos; i<nums.length;i++){
int tmp = nums[pos];
nums[pos] = nums[i];
nums[i] = tmp;
recursiveSwap(nums, pos+1, res);
tmp = nums[pos];
nums[pos] = nums[i];
nums[i] = tmp;
}
}
}
在评论区还看到一种做法 它的思路是每次往之前的res
中插入新的值,直到加完为止。
public static List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if (nums.length == 0 || nums == null)
return res;
List<Integer> list = new ArrayList<Integer>();
list.add(nums[0]); // Add the first element into the list;
res.add(list);
for (int i = 1; i < nums.length; i++) {
// Keep track of the size of current result;
int size = res.size();
for (int j = 0; j < size; j++) {
int size2 = res.get(0).size();
for (int k = 0; k <= size2; k++) {
List<Integer> temp = new ArrayList(res.get(0));
temp.add(k, nums[i]);
res.add(temp);
}
res.remove(0);
}
}
return res;
}
由该解法启发,想到了我原来想写的做法,不需要递归 但是最后排序不太对。。
OS上课太困了 不继续写了
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if(nums == null || nums.length == 0) return res;
List<Integer> list = new ArrayList<Integer>();
for(int i=0;i<nums.length;i++){
list.add(nums[i]);
}
res.add(list); //先往加入一个nums 再慢慢扩充
for (int pos = 0; pos < nums.length-1; pos++) {
int size = res.size();
for (int index = 0; index < size; index++) {
for (int i = pos+1; i < nums.length; i++) {
List<Integer> temp = new ArrayList(res.get(index));
int tmp = temp.get(pos);
temp.set(pos, temp.get(i));
temp.set(i, tmp);
System.out.println(temp);
res.add(temp);
}
}
}
return res;
}
}