首页 > 其他分享 >每日一题:Leetcode-47 全排列

每日一题:Leetcode-47 全排列

时间:2024-08-26 20:27:11浏览次数:5  
标签:排列 nums 47 List 列表 used result Leetcode tempList

力扣题目

解题思路

java代码

力扣题目:

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]
输出:
[[1,1,2],
 [1,2,1],
 [2,1,1]]

示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

解题思路:

算法原理
使用回溯法来生成全排列。通过递归地选择数字并加入临时列表,当临时列表长度达到原始数组长度时,将其加入结果列表。为了处理重复元素,在选择数字时进行了一些条件判断来跳过重复的情况。

思路

  1. 首先对输入数组进行排序,以便后续能够方便地判断重复情况。
  2. 在回溯函数中,对于每个数字,只有在未被使用且不是重复数字的情况下,才将其加入临时列表,并进行递归调用。
  3. 递归调用完成后,将该数字从临时列表中移除,并标记为未使用,以便进行其他可能的排列。

代码分析

  • permuteUnique 方法是主函数,初始化结果列表,对数组排序,然后调用回溯函数。
  • backtrack 方法是回溯函数。
    • 如果临时列表长度达到数组长度,将其加入结果列表。
    • 遍历数组,对于每个数字,通过条件判断决定是否选择该数字。如果可以选择,将其加入临时列表,标记为已使用,进行递归调用,然后恢复状态(移除数字,标记为未使用)。

时间复杂度:O(n*n!),其中  是数组的长度。

空间复杂度:O(n),主要用于递归栈和存储临时列表和结果列表。

java代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class PermutationsII {

    public List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);  // 先排序,方便后续去重
        backtrack(result, new ArrayList<>(), nums, new boolean[nums.length]);
        return result;
    }

    public void backtrack(List<List<Integer>> result, List<Integer> tempList, int[] nums, boolean[] used) {
        if (tempList.size() == nums.length) {
            result.add(new ArrayList<>(tempList));
            return;
        }

        for (int i = 0; i < nums.length; i++) {
            // 如果当前数字已经使用过,或者和前一个相同且前一个未使用,跳过
            if (used[i] || (i > 0 && nums[i] == nums[i - 1] &&!used[i - 1])) {
                continue;
            }

            used[i] = true;
            tempList.add(nums[i]);
            backtrack(result, tempList, nums, used);
            used[i] = false;
            tempList.remove(tempList.size() - 1);
        }
    }

    public static void main(String[] args) {
        int[] nums = {1, 1, 2};
        PermutationsII permutationsII = new PermutationsII();
        List<List<Integer>> permutations = permutationsII.permuteUnique(nums);
        for (List<Integer> permutation : permutations) {
            System.out.println(permutation);
        }
    }
}

更多详细内容同步到公众号,感谢大家的支持!

每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项

标签:排列,nums,47,List,列表,used,result,Leetcode,tempList
From: https://blog.csdn.net/LIUCHANGSHUO/article/details/141572231

相关文章

  • 算法的学习笔记—字符串的排列(牛客JZ38)
    ......
  • 1047 Student List for Course【超简单思路,map,vector,对于超时问题】
    ZhejiangUniversityhas40,000studentsandprovides2,500courses.Nowgiventheregisteredcourselistofeachstudent,youaresupposedtooutputthestudentnamelistsofallthecourses.InputSpecification:Eachinputfilecontainsonetestcase.Fo......
  • 【Leetcode 2032 】 至少在两个数组中出现的值 —— 哈希表与按位运算符(最全的注解)
    给你三个整数数组 nums1、nums2 和 nums3 ,请你构造并返回一个 元素各不相同的 数组,且由 至少 在 两个 数组中出现的所有值组成。数组中的元素可以按 任意 顺序排列。示例1:输入:nums1=[1,1,3,2],nums2=[2,3],nums3=[3]输出:[3,2]解释:至少在两个数组中出......
  • 南沙区信奥赛陈老师讲题:1237:求排列的逆序数
    【题目描述】在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务。对于不同的排名结果可以用逆序来评价它们之间的差异。考虑1,2,…,n1,2,…,n的排列i1,i2,…,ini1,i2,…,in,如果其中存在j,kj,k,满......
  • 代码训练营 Day11 | 150. 逆波兰表达式求值 | 239. 滑动窗口最大值 | 347.前 K 个高频
    150.逆波兰表达式求值逆波兰表达式(后缀表达式)(1+2)x(3+4)的后续表达顺序是:左右中 后缀表达式:12+34+x使用栈思路1.遇见数字就放入栈,遇见操作运算符,取出栈里的数字进行运算2.每次取元素的时候只取两个元素3.结果就是栈最后的元素classSolution(object):d......
  • LeetCode刷题笔记8.19-8.24
    LeetCode刷题笔记8.19-8.2476.最小覆盖子串(8.19)算法常见技巧——滑动窗口滑动窗口即维护一个窗口(特定数据结构),来替代暴力遍历子结构这种“笨办法”窗口所涉及到的元素由left和right两个指针选定,选定范围从(left,right]开始,随着right指针向后遍历,寻找符合题意的某个可行解......
  • 《毁灭全人类》d3dcompiler_47.dll丢失问题的详细排查与恢复步骤
    当您在尝试运行《毁灭全人类》(DestroyAllHumans!)时遇到“d3dcompiler_47.dll丢失”的提示,这意味着您的系统缺少或损坏了一个重要的动态链接库文件。d3dcompiler_47.dll是DirectX的一个组成部分,用于支持3D图形渲染。以下是详细的排查与恢复步骤:排查与恢复步骤1:重新安装Dir......
  • LeetCode 690. 员工的重要性(哈希表、深度优先搜索dfs)
    题目:690.员工的重要性思路:先用哈希表map将每个员工的信息映射到员工ID对应的下标位置。接着使用深度优先搜索dfs,来记录总和即可。细节看注释/*//DefinitionforEmployee.classEmployee{public:intid;intimportance;vector<int>subordinates;......
  • 47.【C语言】指针(重难点)(J)
    目录26.自制排序函数(★★)    *分析    *代码往期推荐26.自制排序函数*分析之前在42.【C语言】冒泡排序写过一个排序函数,可以将此自制一个类似qsort的函数画圈的地方是需要修改的#include<stddef.h>voidbubble_sort(void*base,size_tnum,size_tw......
  • Java | Leetcode Java题解之第374题猜数字大小
    题目:题解:publicclassSolutionextendsGuessGame{publicintguessNumber(intn){intleft=1,right=n;while(left<right){//循环直至区间左右端点相同intmid=left+(right-left)/2;//防止计算时溢出......