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

有重复项数字的全排列

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

解题思路:
利用递归求出各个可能排列,然后再通过两层循环去掉结果res中的重复项。
java代码:

import java.util.*;
public class Solution {
    ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    
    //递归求解
    public void solve(ArrayList<Integer> list, int[] num) {
        if (list.size()==num.length) {    //判断是否取完,若取完则加入res中
            res.add(new ArrayList<>(list));
            return;
        }
        for (int i = 0; i<num.length; i++) {
            if (num[i]==-3)    
                continue;
            list.add(num[i]);
            int nums = num[i];
            num[i] = -3;    //未被取走的num数组中的元素则加入list,并置-3
            solve(list, num);
            list.remove(list.size()-1);
            num[i] = nums;
        }
    }
    
    //排序算法(用的冒泡排序)
    public void sort(int[] a) {
        int temp;
        for (int i = 0; i<a.length; i++) {
            for (int j = 0; j<a.length-i-1; j++) {
                if (a[j]>a[j+1]) {
                    temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                }
            }
        }
    }
    
    public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
        ArrayList<Integer> list = new ArrayList<>();
        //增加排序函数,目的是输出升序
        sort(num);
        solve(list, num);
        //res中包含重复元素,必须去掉
        for (int i = 0; i<res.size(); i++) {
            for (int j = i+1; j<res.size(); j++) {
                if (res.get(i).equals(res.get(j))==true) {
                    res.remove(j--);
                    continue;
                }
            }
        }
        return res;
    }
}
全部评论

相关推荐

在打卡的大老虎很想潜...:你在找实习,没啥实习经历,技术栈放前面,项目多就分两页写,太紧凑了,项目你最多写两个,讲清楚就行,项目背景。用到的技术栈、亮点、难点如何解决,人工智能进面太难了,需求少。你可以加最新大模型的东西
点赞 评论 收藏
分享
牛客62533758...:华为不卡双非,而是卡院校hhhh
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务