46. 全排列

image.png

思路: 肯定是回溯算法,当递归深度 == 数组长度时,说明所有数字都已经使用完了。但是需要加一个used数组,表示当前位置的数字已经使用过,避免出现重复数据

  1. class Solution {
  2. public List<List<Integer>> permute(int[] nums) {
  3. List<List<Integer>> res = new ArrayList<>();
  4. boolean[] used = new boolean[nums.length];
  5. recall(nums,0,res , new ArrayList<>(),used);
  6. return res;
  7. }
  8. public void recall(int[] nums ,int dept , List<List<Integer>> res , List<Integer> arr , boolean[]used){
  9. if(dept == nums.length){
  10. res.add(new ArrayList(arr));
  11. }
  12. for(int i = 0 ;i < nums.length ; i++){
  13. if(!used[i]){
  14. arr.add(nums[i]);
  15. used[i] = true ;
  16. recall(nums,dept+1 , res , arr , used);
  17. used[i] = false;
  18. arr.remove(arr.size() -1);
  19. }
  20. }
  21. }
  22. }