首页 > 其他分享 >BM56 有重复项数字的全排列

BM56 有重复项数字的全排列

时间:2024-07-25 19:58:04浏览次数:16  
标签:排列 重复 res ArrayList BM56 int num path visited

1.题目描述

给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。

数据范围: 0<n≤80<n≤8 ,数组中的值满足 −1≤val≤5−1≤val≤5

要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!)

示例1

输入:

[1,1,2]

返回值:

[[1,1,2],[1,2,1],[2,1,1]]

示例2

输入:

[0,1]

返回值:

[[0,1],[1,0]]

2.解题思路

相比于没有重复项数字的全排列,这一题可能会出现重复的情况

eg:

没重复时:[1,2] -> res = [1,2],[2,1]

有重复时:[1,1] -> res = [1,1],[1,1]  答案列表中会出现两次相同的path,那么就需要进行去重操作

其实进行去重也很容易实现,只需要在for循环内部,判断当前遍历的下标i处的元素,是否与它的前一个元素相同,如果相同,且前一个元素visited=0,那就说明前一个元素的path序列肯定已经被访问过,且加入到res列表中了,当前元素就可以直接跳过了,这样就排除了重复的排列

3.代码实现

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型一维数组 
     * @return int整型ArrayList<ArrayList<>>
     */
    ArrayList<ArrayList<Integer>> res = new ArrayList<>();

    ArrayList<Integer> path = new ArrayList<>();

    public ArrayList<ArrayList<Integer>> permuteUnique (int[] num) {
        // write code here
        Arrays.sort(num);
        int[] visited = new int[num.length];
        backTracking(num,visited);
        return res;
    }

    public void backTracking(int[] num, int[] visited) {
        if (path.size() == num.length) {
            res.add(new ArrayList<Integer>(path));
            return;
        }
        for (int i = 0; i < num.length; i++) {
            if (visited[i] != 0 || (i > 0 && num[i] == num[i-1] && visited[i-1] == 0)) continue;
            visited[i] = 1;
            path.add(num[i]);
            backTracking(num,visited);
            path.remove(path.size()-1);
            visited[i] = 0;
        }
    }
}

标签:排列,重复,res,ArrayList,BM56,int,num,path,visited
From: https://blog.csdn.net/cqjnovo/article/details/140698592

相关文章

  • 第九天|字符串| 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459.
    边写边更中Day9花了我好长时间,由于一道题有好几种方法,感觉今天上午下午都在做Day9,心态有点崩,因为今天还没有时间科研。我决定休息一下,先更到这里。气死我了151.翻转字符串里的单词方法1_fff:定义一个新的字符串str,遍历s,从后往前找到每个单词添加到str中classSolu......
  • 存在重复元素 II-哈希表
    题目描述:个人题解:从左到右遍历数组nums,当遍历到下标i时,如果存在下标j<i使得nums[i]=nums[j],则当i−j≤k时即找到了两个符合要求的下标j和i。如果在下标i之前存在多个元素都和nums[i]相等,为了判断是否存在满足nums[i]=nums[j]且i−j≤k的下标j,应该在这......
  • 代码随想录 day8|| 151 翻转单词 28 字符串匹配 459 重复子串
    151翻转单词funcreverseWords(sstring)string{ //思考:判断单词条件是从0或者空格开始到终或者空格结尾,最简单方式strings.split之后变成切片,然后反转就行了 //考虑双指针,左指针指向单词首位,右指针指向单词末尾 varres[]byte varleft,rightint forright<len......
  • 求最小整数——全排列实现
    题目描述如图,将1~10这10个自然数以任意顺序排成一行,填入第一行的10个圆圈中,第二行最中间的圆圈填0,出了这1个圆圈之外,其余每一个圆圈所填的数字都等于它上方与之相连的圆圈中两个数的和,那么第十行的数N最小值是多少?输入无输出一个正整数解题思路将这个图看成是一个10行......
  • 在 Python 中动态定义文字字符串排列的并集
    我有一个字符串列表:strings=['a','b','c']我想声明列表中所有可能的有序对的Union类型。硬编码,这看起来像:Literal我如何动态定义CustomType=Literal['ab','ac','aa','ba','bb','bc�......
  • C++深拷贝构造函数解决浅拷贝的堆区内存重复释放问题
    1.简单介绍先简单介绍一下浅拷贝和深拷贝:浅拷贝->简单的赋值拷贝操作,默认的拷贝构造函数就是浅拷贝。深拷贝->在堆区重新申请空间,进行拷贝操作。2.问题展示下面用代码示例明了地展示默认拷贝构造函数浅拷贝带来地堆区内存重复释放问题:#include<iostream>usingnamespace......
  • 如何在Python中从两个不同长度的列表创建DataFrame,为第二个列表中的每个值重复第一个
    我是一个超级初学者,所以请耐心等待。我觉得这应该很容易,但我无法弄清楚。我不确定是否应该创建两个列表,然后将它们组合起来,或者是否有办法以这种方式直接创建DataFrame。我需要一列包含这些值:df=pd.DataFrame({'x1':np.linspace(-2.47,2.69,num=101)})然后我将值A......
  • 说透事务中的脏读、脏写、不可重复读、幻读
    事务的四个基本特性:ACID,原子性,一致性,隔离性,持久性。事务的脏读、脏写、不可重复读、幻读等问题,主要发生在并发事务中。没有并发事务,就不会有上述问题。事务并发时,会带来两个问题:写冲突:多个事务同时修改同一条数据,写的先后顺序如何确定?一个事务已经提交了,另一个事物回滚了,怎么办......
  • 为什么我的 VS Code 终端有时会显示重复的输出行,可以采取哪些措施来防止这种情况发生?
    我在VSCode中运行Python脚本,内置终端有时会错误地显示重复的输出块。下面是一个示例:在本例中,我请求打印一个20行的表格(max_rows=20),但VSCode终端在尝试显示表格的第一部分时“结结巴巴”。为什么会发生这种情况以及解决方法是什么?......
  • 使用python,如何创建重复的工作时间表
    这是我们公司的小组工作安排表。为三班制,2组日夜工作,1组休息。重复白天工作4天休息2天,然后再次夜间工作4天休息2天的时间表。我想使用python(pandas)自动安排在8月9日之后。抱歉英语不好,提前感谢您的帮助以下是使用Python和Pandas创建重复工作时间表的代码......