力扣Top100之全排列

114 阅读1分钟

题目描述

leetcode上的46.全排列,难度为中等。

Tag:数组、回溯

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

 

示例 1:

输入: nums = [1,2,3]
输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入: nums = [0,1]
输出: [[0,1],[1,0]]

示例 3:

输入: nums = [1]
输出: [[1]]

 

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

解题思路

lists中存放的是所有的结果集,list里面存放的是其中的一种可能,当所有数都用完了,即list.size() == nums.length,将list存到lists中,说明这一种可能成立,也是回溯的终止条件。

for循环遍历的是nums中的数据,题目给出数字不重复,则需要用contains方法判断是否存在重复的数字,如果存在,则跳出本次循环。其实当前数字只有两种可能,一是当前数字放到集合当前位置中,二是当前数字不放在当前位置中。

解题代码

    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> lists = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        per(lists,list,nums);
        return lists;
    }
    private void per(List<List<Integer>> lists,List<Integer> list,int[] nums){
        //所有数都填完了
        if(list.size()==nums.length) {
            lists.add(new ArrayList<>(list));
            return;
        }
        for(int i=0;i<nums.length;i++){
            //如果list集合中不能存在重复的数
            if(list.contains(nums[i])) continue;
            //将此数加入到集合中
            list.add(nums[i]);
            per(lists,list,nums);
            //将此数移除
            list.remove(list.size()-1);
        }
    }

最后

这是[力扣Top100]系列第三篇文章,如果有错误的地方,欢迎指正,如果你有更好的解法,欢迎在评论区讨论。

如果你想了解更多内容,要记得关注我我,我的公众号【小超学编程】。