LeetCode-46. Permutations(Medium):
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]
]
我的解法:
虽然一顿瞎写才想到要用递归的方法。。。但。。总之是走在了正确的道路上。
这道题类似于一个深度优先遍历,确定序列的第一位,之后的子序列的排列就变成了子问题,符合递归的条件。
写java程序的过程中发现一个问题,设置了变量List<List<Integer>> ans和List<Integer> tmp,然后用ans.add(tmp)添加,结果发现只要tmp里的值变化,ans里的值也会跟着变。。。原来java中的变量直接相互复制都是使用同一块内存,复制的只是地址值(这里提一下:java没有指针和引用,所以就没有引用传递,都是按值传递)想让他们可以互不影响的相互赋值,只有分别申请内存,然后循环赋值才可以。参考:https://blog.csdn.net/qq_34476727/article/details/80333672
class Solution {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> tmp = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
if(nums.length == 1) {
tmp.add(nums[0]);
List<Integer> tmp1 = new ArrayList<>();
for(int t:tmp) {
tmp1.add(t);
}
ans.add(tmp1);
tmp.remove(tmp.size()-1);
return ans;
}
for(int i=0; i<nums.length; i++) {
tmp.add(nums[i]);
int[] nums1 = new int[nums.length-1];
int k=0;
for(int j=0; j<nums.length; j++) {
if(j!=i) {
nums1[k] = nums[j];
k++;
}
}
permute(nums1);
tmp.remove(tmp.size()-1);
}
return ans;
}
}