47. 全排列 II(含重复数字的全排列)

与不含重复数字的全排列相比,在于:
排序;
添加对上一数字的判断

class Solution {
    LinkedList<List<Integer>> ans=new LinkedList<>();
    LinkedList<Integer> path=new LinkedList<>();
    boolean[] used;
    public List<List<Integer>> permuteUnique(int[] nums) {
      used=new boolean[nums.length];
      Arrays.sort(nums);//全排列去重,这是关键
      dfs(nums,0);
      return ans;

    }
    void dfs(int[] nums,int cnt){
        if(cnt==nums.length){
            ans.add(new LinkedList(path));
            return;
        }

        for(int i=0;i<nums.length;i++){
            if(i>0&&nums[i]==nums[i-1]&&!used[i-1])//上一个数字和本数字相同,且上一个数字没有被访问。
            //那么本次的搜索一定是是重复的
                 continue;
            if(!used[i]){
                used[i]=true;
                path.add(nums[i]);
                dfs(nums,cnt+1);
                used[i]=false;
                path.removeLast();
            }
        }

    }
}
上一篇:47.输入某年某月某日,判断这一天是这一年的第几天?程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于时需考虑多加一天。


下一篇:mybatis xml 报错