LeetCode 第46,47题(Permutations)Java

来源:互联网 发布:基础软件服务经营范围 编辑:程序博客网 时间:2024/06/08 12:09

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

第四十六题允许重复,四十七题不允许;

在解法上有相似的地方;

思路:这道全排列问题可以递归地去做,先确定一个值,对剩下的进行递归;

实际上是一道关于深度优先搜索算法的题目;

参考了这一篇博客:http://blog.csdn.net/chenchaofuck1/article/details/51194976

代码:

public class Solution {    public List<List<Integer>> permuteUnique(int[] nums) {        List<List<Integer>> allLists=new LinkedList<>();        dfs(allLists,nums,0);        return allLists;    }        void dfs(List<List<Integer>> Lists,int[] nums,int s){        if(s==nums.length){            List<Integer> list=new LinkedList<>();            for(int i=0;i<nums.length;i++){                //将一个排好序的序列存储起来;                list.add(nums[i]);            }            Lists.add(list);        }else{            for(int i=s;i<nums.length;i++){                boolean flag=false;         //flag部分针对47题,在元素出现重复时不进行交换;                for(int j=s;j<i;j++){       //                    if(nums[j]==nums[i]){   //                        flag=true;          //                    }                       //                }                           //                 if(flag){                   //                    continue;               //                }                           //                //交换两数字顺序;                int tmp=nums[s];                nums[s]=nums[i];                nums[i]=tmp;                dfs(Lists,nums,s+1);                //交换回来;                nums[i]=nums[s];                nums[s]=tmp;            }        }    }}


利用flag去除重复的部分实际上是剪枝,将搜索树中一些值去除,不进行计算;


0 0