难度中等1116
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
通过次数251,458提交次数324,356
参考(示例图):https://leetcode-cn.com/problems/permutations/solution/quan-pai-lie-by-leetcode-solution-2/
解答成功:
执行耗时:2 ms,击败了53.60% 的Java用户
内存消耗:38.7 MB,击败了48.79% 的Java用户
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
List<List<Integer>> res = new ArrayList<>();
//以1,2,3为例
// 从头到尾,在第一个位置选择填充一个数(三种情况),
// 然后再后移一个位置从剩下的数里面再选择一个值做填充,直到结尾
//这里巧妙的使用f来作为替换的位置标识
public void func(List<Integer> nums,int f){
//nums是原来的数组。f用来标识当前替换的位置
//递归退出条件是当前的f替换的位置已经到最后一个了
if (f==nums.size()-1) {
res.add(new ArrayList<>(nums));
return;
}
int temp=0;
for (int i = f; i < nums.size(); i++) {
//使用i位置的数替换f 做本次的运算
temp=nums.get(i);
nums.set(i, nums.get(f));
nums.set(f,temp);
//继续选择下一个位置做填充
func(nums, f+1);
//交换回原来
temp=nums.get(i);
nums.set(i, nums.get(f));
nums.set(f,temp);
}
}
public List<List<Integer>> permute(int[] nums) {
//转list就用最简单的方法即可
List<Integer> newnums = new ArrayList<>();
for(int i=0;i<nums.length;i++){
newnums.add(nums[i]);
}
func(newnums,0);
return res;
}
}