参考代码来自:
    https://blog.csdn.net/u013309870/article/details/68941284

    1. // 该代码已经在leetcode上提交测试通过,快过95%的提交
    2. class Solution {
    3. public List<List<Integer>> permute(int[] nums) {
    4. List<List<Integer>> res = new ArrayList<>();
    5. Permutation(nums, 0, res);
    6. return res;
    7. }
    8. public void Permutation(int nums[],int start, List<List<Integer>> res )
    9. {
    10. if(start==nums.length-1)
    11. {
    12. Arrays.toString(nums);
    13. List<Integer> onePermu = new ArrayList<>();
    14. for(int i : nums){
    15. onePermu.add(i);
    16. }
    17. res.add(onePermu);
    18. //如果已经到了数组的最后一个元素,前面的元素已经排好,输出。
    19. }
    20. for(int i=start;i<=nums.length-1;i++)
    21. {
    22. //把第一个元素分别与后面的元素进行交换,递归的调用其子数组进行排序
    23. Swap(nums,i,start);
    24. Permutation(nums,start+1, res);
    25. Swap(nums,i,start);
    26. //子数组排序返回后要将第一个元素交换回来。
    27. //如果不交换回来会出错,比如说第一次1、2交换,第一个位置为2,子数组排序返回后如果不将1、2
    28. //交换回来第二次交换的时候就会将2、3交换,因此必须将1、2交换使1还是在第一个位置
    29. }
    30. }
    31. public void Swap(int nums[],int i,int j)
    32. {
    33. int temp;
    34. temp=nums[i];
    35. nums[i]=nums[j];
    36. nums[j]=temp;
    37. }
    38. }