Leetcode 每日抑题 (47. 全排列 II)

本贴最后更新于 1525 天前,其中的信息可能已经时移世异

wallhavendg13mj.jpg

LeetCode 的每日抑题系列 , LeetCode 会每天随机一道题作为签到题.我也是菜鸡,如果今天没 A 掉,那只能证明我离大神又进了一步.

这次为什么使用 java 呢,是因为 java 版本使用的内存少,写起来方便,如果是 scala 的话,需要写大量的 ListBuffer

image.png

题目链接

题名 通过率 难度
全排列 II 60.7% 中等

解题思路

就是求解去重后的全排列

暴力思路

DFS枚举出所有的情况,枚举完成之后去重处理.最坏的情况就是原数组数字全是一样的,可能会出现超时.

优化搜索

DFS枚举的过程中利用剪枝,减少重复排列的遍历,有前提,要经过排序,使得重复数字相邻出现.

java 代码

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

/**
 * 描述:
 *
 * @author ludengke
 * @create 2020-09-14 10:58
 */
public class Solution3Java {
    public List<List<Integer>> permuteUnique(int[] nums) {
        boolean[] use = new boolean[nums.length];
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> path = new ArrayList<>();
        Arrays.sort(nums);
        permuteUnique(nums,nums.length,0,use,path,result);
        return result;
    }

    /**
     * 
     * @param nums 排序后原数组
     * @param length 数组长度
     * @param depth 已加入遍历路径path的元素的个数
     * @param use 标记当前元素是否使用
     * @param path 已遍历的路径
     * @param result 存储全部结果
     */
    public void permuteUnique(int[] nums,int length,int depth,boolean[] use,List<Integer> path,List<List<Integer>> result) {
        //全部元素已加入,则输出排序
        if(length == depth){
            result.add(new ArrayList<>(path));
        }else {
            //依次把未使用的数字加入到路径中,递归处理
            for(int i = 0;i < length; i++){
                //已使用略过
                if(use[i] == true){
                    continue;
                }
                //剪枝操作: 当前值和前一个值一样,并且前一个值经过了回溯 use[i-1] == false必须得有
                //剪掉的分支是 本次循环和上次循环的取得的数字一样则可以略过. 
                //use[i-1] = =true的时候是某重复元素的第一个实例已加入,进入递归,选择到了某重复元素的第一个实例,这种情况不需要剪枝处理
                if(i > 0 && nums[i] == nums[i-1] && use[i-1] == false ){
                    continue;
                }

                //标记已使用
                use[i] = true;
                //加入路径
                path.add(nums[i]);
                //递归处理子节点
                permuteUnique(nums,length,depth+1,use,path,result);
                //回溯处理,删除加入的最后一个节点,以及标记为未使用
                path.remove(depth);
                use[i] = false;
            }
        }
    }

    public static void main(String[] args) {
        Solution3Java test = new Solution3Java();
        System.out.println(test.permuteUnique(new int[]{1,2,3}));
    }
}

算法 or 数据结构

  1. DFS 递归交换求全排列算法
  2. DFS,递归,全排列

扩展问题

种草

  • 每日抑题
    6 引用 • 3 回帖
  • 全排列
    1 引用
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...