46. Permutations && 47. Permutations II

Given a collection of distinct numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].

第一种方法。dfs

public class Solution {
   public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> r = new ArrayList<List<Integer>>();
        ArrayList<Integer> tmp = new ArrayList<Integer>();
        if (nums.length == 0 || nums == null){
            r.add(tmp);
            return r;
        }
        dfs(r, tmp,nums, 0);
        return r;

   }
    private void dfs(List<List<Integer>> r,ArrayList<Integer> tmp,int[] nums,int begin){
        if (tmp.size() == nums.length) {
            r.add(new ArrayList<Integer>(tmp));
            return;
        }
        else {
            for (int i = begin; i < nums.length; i++) {
                tmp.add(nums[i]);
                int t = nums[i];
                nums[i] = nums[begin];
                nums[begin] = t;
                dfs(r, tmp, nums, begin+1);
                tmp.remove(tmp.size()-1);
                t = nums[i];
                nums[i] = nums[begin];
                nums[begin] = t;

            }
        }

    }
}

也可以用BFS来做

 public List<List<Integer>> permute(int[] nums) {
        LinkedList<List<Integer>> r = new LinkedList<List<Integer>>();
        ArrayList<Integer> tmp = new ArrayList<Integer>();
        if (nums.length == 0 || nums == null){
            r.add(tmp);
            return r;
        }
        r.add(tmp);
        for(int n:nums){
            int size = r.size();
            for(;size > 0;size--){
                List<Integer> t = r.poll();
                for(int i = 0;i <= t.size();i++){
                    List<Integer> cur = new ArrayList<Integer>(t);
                    cur.add(i,n);
                    r.add(cur);
                }
            }
        }
        return r;
    }

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,
[1,1,2] have the following unique permutations:
[1,1,2], [1,2,1], and [2,1,1].
有可能出现重复。
最简单的方法是修改上面代码,增加查重;但查重效率很低,运行的很慢。

public List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> r = new ArrayList<List<Integer>>();
        ArrayList<Integer> tmp = new ArrayList<Integer>();
        if (nums.length == 0 || nums == null){
            r.add(tmp);
            return r;
        }
        dfs(r, tmp,nums, 0);
        return r;
    }
    private void dfs(List<List<Integer>> r,ArrayList<Integer> tmp,int[] nums,int begin){
        if (tmp.size() == nums.length) {
            r.add(new ArrayList<Integer>(tmp));
            System.out.println(tmp);
            return;
        }
        else {
            for (int i = begin; i < nums.length; i++) {    //查重
                for (int j = begin; j < i && i < nums.length; j++) {
                    if (nums[j] == nums[i]){
                        i++;
                        j = begin-1;
                    }  
                }
                if(i == nums.length) return;
                tmp.add(nums[i]);
                int t = nums[i];
                nums[i] = nums[begin];
                nums[begin] = t;
                dfs(r, tmp, nums, begin+1);
                tmp.remove(tmp.size()-1);
                t = nums[i];
                nums[i] = nums[begin];
                nums[begin] = t;
            }
        }

    }

另一种方法是排序,可以降低查重难度。

public List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> r = new ArrayList<List<Integer>>();
        ArrayList<Integer> tmp = new ArrayList<Integer>();
        if (nums.length == 0 || nums == null){
            r.add(tmp);
            return r;
        }
        Arrays.sort(nums);
        List<Integer> num = new ArrayList<Integer>();
        boolean[] used = new boolean[nums.length];
        dfs(r, tmp,nums, 0,used);
        return r;
    }
    private void dfs(List<List<Integer>> r,ArrayList<Integer> tmp,int[] nums,int begin,boolean[] used){
        if (tmp.size() == nums.length) {
            r.add(new ArrayList<Integer>(tmp));
            return;
        }
        else {
            for (int i = 0; i < nums.length; i++) {    //查重
                if(used[i]) continue;
                if(i > 0 && nums[i] == nums[i-1] && !used[i-1] ) continue;
                tmp.add(nums[i]);
                used[i] = true;
                dfs(r, tmp, nums, begin+1,used);
                tmp.remove(tmp.size()-1);
                used[i] = false;
            }
        }

    }

另,BFS方法只做了简单的修改,即用set来防止重复

  public List<List<Integer>> permuteUnique(int[] nums) {
        LinkedList<List<Integer>> r = new LinkedList<List<Integer>>();
        ArrayList<Integer> tmp = new ArrayList<Integer>();
        if (nums.length == 0 || nums == null){
            r.add(tmp);
            return r;
        }
        r.add(tmp);
        for(int n:nums){
            int size = r.size();
            Set<String> set = new HashSet<String>();
            for(;size > 0;size--){
                List<Integer> t = r.poll();
                for(int i = 0;i <= t.size();i++){
                    List<Integer> cur = new ArrayList<Integer>(t);
                    cur.add(i,n);
                    if(!set.contains(cur.toString())){
                        r.add(cur);
                        set.add(cur.toString());
                    }
                }
            }
        }
        return r;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值