题解 | #有重复项数字的全排列#

有重复项数字的全排列

https://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型一维数组 
     * @return int整型ArrayList<ArrayList<>>
     */
     //储存数组
     ArrayList<ArrayList<Integer>> res=new ArrayList<>();
    public ArrayList<ArrayList<Integer>> permuteUnique (int[] num) {
        // write code here
        //数组排序
        Arrays.sort(num);
        //调用排序函数
        LinkedList<Integer> list=new LinkedList<>(); 
        boolean[] used=new boolean[num.length];
        backTrack(num,list,used);
        return res;

    }
    public void backTrack(int[] num,LinkedList<Integer> list,boolean[] used){
        //递归结束的条件
        if(list.size()==num.length){
            res.add(new ArrayList<>(list));
        }
        //函数逻辑
        //没有出现过的数字,加入数组,之前我们用的list.contains,但是现在有重复元素了,所有不能用了,我们现在用used[i]这个标识,为true表示加过了,跳过i
        for(int i=0;i<num.length;i++){
            if(used[i]){
                continue;
            }
            //当前的值和上一个添加的值相等
            if(i>0&&num[i]==num[i-1]&&used[i-1]){
                continue;
            }
            list.add(num[i]);
            //添加完了 将该数字的标识改成用过了
            used[i]=true;
            backTrack(num,list,used);
            //回溯
            list.removeLast();
            //下一分支
             used[i]=false;
        }
    }

}

全部评论

相关推荐

10-09 09:39
门头沟学院 C++
HHHHaos:这也太虚了,工资就一半是真的
点赞 评论 收藏
分享
Noob1024:一笔传三代,人走笔还在
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务