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

有重复项数字的所有排列

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


public class Solution {
    boolean[] marked;
    public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
        //存储总的返回结果
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        //存合法全排列
        LinkedList<Integer>  track = new LinkedList<>();
        
        marked = new boolean[num.length];
        //排序
        Arrays.sort(num);
        backtrack(num, result,track);
        return result;
    }
    
    public void backtrack(int[] num, ArrayList<ArrayList<Integer>> result, LinkedList<Integer> track){
        if(track.size() == num.length){
            //一个全排列
            result.add(new ArrayList<Integer>(track));
            return;
        }
        for(int i = 0;i< num.length;i++){
              if(marked[i] || i >0 && num[i] == num[i-1] &&!marked[i-1]){
                  // i 访问过了 
                  //或者 回溯后 i本次回溯完变成了fasle  下一次 i+1的时候 如果数相等 那就不需要再遍历了 针对i而言 就是i-1
                   continue;
                }
             track.add(num[i]);
            //已经访问过了
            marked[i] = true;
            //寻找下一个 数据
            backtrack(num, result, track);
            //回溯 最后一个数删除
            track.removeLast();
            //每一次排列 都需要重置再来
            marked[i] = false;
        }

    }
}
全部评论

相关推荐

本科生是不是只能去送外卖了
有气魄的海豚在喝茶:外卖这个版本被保安克制
点赞 评论 收藏
分享
ALEX_BLX:虽然说聊天记录不可信,不过这个趋势确实如此但我觉得也要想到一点就是卷后端的人里真正有“料”的人又有多少,我说的这个料都不是说一定要到大佬那种级别,而是就一个正常的水平。即使是现在也有很多人是跟风转码的,2-3个月速成后端技术栈的人数不胜数,但今时不同往日没可能靠速成进大厂了。这种情况就跟考研一样,你能上考场就已经打败一半的人了
点赞 评论 收藏
分享
03-29 14:19
门头沟学院 Java
你背过凌晨4点的八股文么:加油同学,人生的容错率很高,只是一个暑期罢了,后面还有很多机会!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务