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

有重复项数字的全排列

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

import java.util.*;

public class Solution {
    private static final int N = 10;//排列的最大长度
    int[] path = new int[N];//存储深搜路径
    boolean[] isVisited = new boolean[N];//储存当前节点是否被访问过
    int[] realNum;//静态成员接收数组,以添加到列表中
    ArrayList<ArrayList<Integer>> res = new ArrayList<>();//结果集合
    int step;//深搜的步数,也就是递归树的最大高度

    void dfs(int u) {
        //到达深搜底部记录结果
        if (u == step) {
            ArrayList<Integer> one = new ArrayList<>();//记录一个排列
            for (int i = 1; i <= step; i++) {
                one.add(realNum[path[i] - 1]);
            }
          //只需要比无重复数字全排列多判断一次
            if (!res.contains(one)) {
                res.add(one);
            }
        }
        for (int i = 1; i <= step; i++) {
            //如果当前节点未被访问过,则标记该节点,由该节点继续向下搜索
            if (!isVisited[i]) {
                path[u + 1] = i;
                isVisited[i] = true;
                dfs(u + 1);
                isVisited[i] = false;
            }
        }
    }

    public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
        realNum = num;
        Arrays.sort(realNum);//对数组进行排序
        step = realNum.length;//记录深搜步数
        dfs(0);
        return res;
    }
}
全部评论

相关推荐

Mush3r:1. 项目包装一下,比如说“跟某某电网/企业合作,已经实际交付”之类的,这样别人就觉得你至少是个实际的项目不是个玩具项目; 2. 对于 axios 这种工具,不要写“利用”,别人觉得是就是在调包,没什么技术含量,要写“重新封装”,可能实际上就是封装了一些 url 前缀之类的,但是听起来就更高级一点; 3. 结合缓存实现用户登陆,你作为前端是如何实现的?如何鉴权?token 过期如何设置?如何保证非登录用户不能访问页面/请求拦截器?一个都写没,前面这些都是面试会问的问题,但是面试官看了你这句话可能也不知道该问什么; 4. 利用 Vue3,通过 。。。 组件库,又是调包,这种没什么工作量,就是拿过来用一用的就不要往详情里写了,开头总结的时候提一嘴就行了; 后面小程序不怎么懂,不评价了
点赞 评论 收藏
分享
舞台少女神顺光:🐟小c的一选也只有一个hc,飞哥值得
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务