当前位置: 首页 > news >正文

Leetcode 47 全排列 II

题意理解

        首先理解全排列是什么?全排列:使用集合中所有元素按照不同元素进行排列,将所有的排列结果的集合称为全排列。

        这里的全排列难度升级了,问题在于集合中的元素是可以重复的。

        问题:相同的元素会导致排列重复,需要对结果进行去重操作。

        难点:如何去重?

解题思路

        排列可以用回溯方法来进行解决。可以将其解决方案抽象为一棵树结构。

        我们可以发现:

                当前枝当前层,选择到重复的元素时,后出现两个相同的树枝结构,造成相同的相同的重复的结果,所以去重应该剪枝:当前枝当前层重复元素的选择。——树层去重。

        为了实现树层去重:我们维护一个used[]数组来记录元素的访问状态

        used数组的作用:        

                保证所有元素只是用一次。

                来辅助树层去重操作。

1.暴力回溯+剪枝优化

回溯解决问题的三个关键步骤:

        确定返回值和参数列表

        确定终止条件

        确定单层递归逻辑:1.保证元素只用一次  2.树层剪枝,防止重复值造成结果重复。

List<List<Integer>> result=new ArrayList<>();LinkedList<Integer> path=new LinkedList<>();boolean[] used=null;public List<List<Integer>> permuteUnique(int[] nums) {Arrays.sort(nums);used=new boolean[nums.length];//初始化默认值falsebacktracking(nums);return  result;}public void backtracking(int[] nums){//确定终止条件if(path.size()== nums.length){result.add(new ArrayList<>(path));return;}//单层递归逻辑for(int i=0;i<nums.length;i++){if(used[i]==true) continue;//该元素用过if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false) continue;//同枝同层剪枝path.add(nums[i]);used[i]=true;backtracking(nums);path.removeLast();used[i]=false;}}

2.分析

时间复杂度:O(n×n!)

空间复杂度:O(n)

http://www.lryc.cn/news/260257.html

相关文章:

  • C# 图解教程 第5版 —— 第18章 泛型
  • 保障事务隔离级别的关键措施
  • Docker导入导出镜像、导入导出容器的命令详解以及使用的场景
  • 虚拟化嵌套
  • 【XILINX】记录ISE/Vivado使用过程中遇到的一些warning及解决方案
  • Tableau进阶--Tableau数据故事慧(20)解构Tableau的绘图逻辑
  • 45.0/HTML 简介(详细版)
  • Python 如何进行游戏开发?
  • 到底什么是DevOps
  • Keil生成bin文件
  • 【STM32】USART串口协议
  • 淋雨试验箱
  • 02-MQ入门之RabbitMQ简单概念说明
  • 敏感信息泄漏怎么破?来试试极狐GitLab 的密钥检测吧
  • go学习之网络编程
  • 将数组中的数逆序存放
  • Unity Web 浏览器-3D WebView中有关于CanvasWebViewPrefab
  • 一款计算机顶会爬取解析系统 paper info
  • CommonJs模块化实现原理ES Module模块化原理
  • 实验4.1 静态路由的配置
  • Java网络编程-深入理解BIO、NIO
  • ShenYu网关注册中心之HTTP注册原理
  • 探索GameFi:区块链与游戏的未来融合
  • Windows下使用CMake编译lua
  • 【C语言(十一)】
  • 系统运行占用过高
  • HTML---初识CSS
  • 监控pod 容器外网请求网络带宽,过滤掉内网、基于k8spacket开发、prometheus开发export
  • windows下docker环境安装
  • Python小程序 - 表格数值统计