题解 | #有重复项数字的全排列,TreeSet去重排序#

有重复项数字的全排列

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

import java.util.*;

public class Solution {
    public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
        //定义一个TreeSet,指定排序规则(字典序规则)
        TreeSet<ArrayList<Integer>> set = new TreeSet<>(new Comparator<ArrayList<Integer>>() {
            public int compare(ArrayList<Integer> arr1 , ArrayList<Integer> arr2) {
                for(int i = 0 ; i < arr1.size() ; i ++) {
                    if(arr1.get(i) > arr2.get(i)) {
                        return 1 ;
                    } else if (arr1.get(i) < arr2.get(i)) {
                        return -1 ;
                    }
                }
                return 0 ;
            }
        }) ;
        help(num , 0 , new ArrayList<>() , set) ;
        ArrayList<ArrayList<Integer>> res = new ArrayList<>(set) ;
        return res ;
    }
    /*
    得到arr[start]及其之后所有元素的全排列,并将结果保存到res中
    其中tmp保存的是当前arr[start]的值
    */
    public void  help(int []arr , int start , ArrayList<Integer> tmp,TreeSet<ArrayList<Integer>> res) {
        if(start == arr.length) {
            ArrayList<Integer> r = new ArrayList<>(tmp) ;
            res.add(r) ;
            return ;
        }
        for(int j = start ; j < arr.length ; j ++) {//这个位置之后的元素,都可能出现在这个位置
            swap(arr , start , j) ;//和j位置元素交换
            tmp.add(arr[start]) ;//保存新的arr[start]
            help(arr , start + 1 , tmp , res) ;//求这个start之后的元素的全排列
            swap(arr , start , j) ;//递归返回后恢复现场
            tmp.remove(tmp.size()-1) ;//移除当前元素,恢复现场
        }            
        
    }
    //交换元素
    public void swap(int num[] , int i , int j) {
        int t = num[i] ;
        num[i] = num[j] ;
        num[j] = t ;
    }
}

一个菜鸟的算法刷题记录 文章被收录于专栏

分享一个菜鸟的成长记录

全部评论

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
11-18 15:57
门头沟学院 Java
最终归宿是测开:这个重邮的大佬在重邮很有名的,他就喜欢打92的脸,越有人质疑他,他越觉得爽😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务