内卷大厂系列《全排列问题二连击》

作者:mzoe666888

 

大厂高频算法面试题:《全排列问题系列》,您将学到如何设计递归,递归的好坏直接影响到动态规划,其次递归涉及到深度优先遍历时,要考虑恢复现场,如何剪枝,如何去重等技巧。

一、全排列问题 I

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1

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

示例 2

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

示例 3

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

leetcode

1、分析

方法一暴力解,当前来到i位置,i之前的位置(左边)已经做了选择,只能从i开始向右边做选择,从N个数中选一个,然后i+1位置上从N-1个数中选一个,i+2位置从N-2个数中选一个

arr[0...i]已经做了选择,从arr[i+1...]做选择

方法二深度优先遍历,当前来到index位置,arr[0...index-1]位置上的数已经选好了,从arr[index...N-1]选数,把每轮收集的排列用ans收集起来,记得要清理现场,深度优先遍历一概的技巧。

2、实现

2.1、方法一

public static List<List<Integer>> permute(int[] nums) {List<List<Integer>> ans = new ArrayList<>();HashSet<Integer> rest = new HashSet<>();for (int num : nums) {rest.add(num);}ArrayList<Integer> path = new ArrayList<>();f(rest, path, ans);return ans;
}// rest中有剩余数字,已经选过的数字不在rest中,选过的数字在path里
public static void f(HashSet<Integer> rest, ArrayList<Integer> path, List<List<Integer>> ans) {if (rest.isEmpty()) {ans.add(path);} else {for (int num : rest) {ArrayList<Integer> curPath = new ArrayList<>(path);curPath.add(num);HashSet<Integer> clone = cloneExceptNum(rest, num);f(clone, curPath, ans);}}
}public static HashSet<Integer> cloneExceptNum(HashSet<Integer> rest, int num) {HashSet<Integer> clone = new HashSet<>(rest);clone.remove(num);return clone;
}

2.2、方法二

public static List<List<Integer>> permute(int[] nums) {List<List<Integer>> ans = new ArrayList<>();process(nums, 0, ans);return ans;
}// 当前来到 index 位置,之前的nums[0...index-1] 的数已经选好了,从num[index...]开始选数
// 选好的答案放在ans里
public static void process(int[] nums, int index, List<List<Integer>> ans) {if (index == nums.length) { // base caseArrayList<Integer> cur = new ArrayList<>();for (int num : nums) {cur.add(num);}ans.add(cur);} else {for (int j = index; j < nums.length; j++) {swap(nums, index, j);process(nums, index + 1, ans);swap(nums, index, j); // 深度优先遍历,清理现场}}
}public static void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;
}

二、全排列问题 II

给定一个可包含重复数字的序列 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]]

leetcode

1、分析

全排列问题II就是在全排列问题I的基础上增加去重机制,仅此而已。

2、实现

public static List<List<Integer>> permuteUnique(int[] nums) {List<List<Integer>> ans = new ArrayList<>();process(nums, 0, ans);return ans;
}public static void process(int[] nums, int index, List<List<Integer>> ans) {if (index == nums.length) {ArrayList<Integer> cur = new ArrayList<>();for (int num : nums) {cur.add(num);}ans.add(cur);} else {HashSet<Integer> set = new HashSet<>();  // 防重for (int j = index; j < nums.length; j++) {if (!set.contains(nums[j])) {set.add(nums[j]);swap(nums, index, j);process(nums, index + 1, ans);swap(nums, index, j);}}}
}public static void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;
}

三、总结

增加去重表(剪枝):去重标记,在递归发生的过程中去重,剪掉

不剪枝(过滤):不增加去重表,递归全部跑完,收集的结果中去重(Set)

  1. 递归函数的设计好坏直接影响到动态规划

  2. 递归涉及到深度优先遍历时,要考虑恢复现场

  3. 递归过程中是否走过,可以增加标记表,剪枝效果

  4. 递归完毕后,也可以增加Set表去重,过滤效果

“做程序员,圈子和学习最重要”因为有有了圈子可以让你少走弯路,扩宽人脉,扩展思路,学习他人的一些经验及学习方法!同时在这分享一下是一直以来整理的Java后端进阶笔记文档和学习资料免费分享给大家!需要资料的朋友私信我扣【06】
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/50535.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二连杆纯连杆动力学建模——LangrageEquation with Matlab

运用拉格朗日方程建立二连杆的纯连杆动力学方程&#xff0c;通过推导其过程明白原理。通过优化程序向多连杆动力学过度&#xff0c;方便后期计算n连杆动力学控制做基础。 我首先通过笔算整整算了10页纸&#xff0c;和参照书本结果一直。然后进行了逐步计算的matlab化&#xff0…

通达与阿里云强强联手,成为阿里云在协同办公领域的重要战略伙伴

企业高速发展&#xff0c;对各类管理软件的需求日益增长&#xff0c;随之而来的是系统孤立、数据不通、应用操作繁琐以及部署运维成本高、投入大、成效慢等问题。现在&#xff0c;通达与阿里云通力合作&#xff0c;通过面向不同规模的企业提供以知识管理和协同办公为核心的云上…

通达OA 办公系统(Office Anywhere)动态密码配置使用详解

为了增强软件系统的安全性&#xff0c;通达科技总部引进海月通信公司自主研发的动态密码系统&#xff0c;内置于通达OA系统中&#xff0c;给用户提供“通达OA静态密码&#xff0b;海月动态密码”和“通达OA&#xff0b;动态密码”的集安全于一体的信息化整体解决方案。 动态密…

生态战略撬动司法产业AI 新视云与阿里云达成合作

4月26日&#xff0c;在云栖大会南京峰会上&#xff0c;新视云与阿里云达成合作&#xff0c;共同研发适用于司法产业的先进AI技术&#xff0c;并推动技术落地。首期目标建设1万间云上法庭。这是继华宇、通达海之后&#xff0c;加入阿里云产业AI生态的又一重量级司法合作伙伴。 阿…

从司法领域看阿里云产业AI策略:生态联盟,技术赋能

为什么80%的码农都做不了架构师&#xff1f;>>> 摘要&#xff1a; 在日前结束的云栖大会深圳峰会上&#xff0c;除了阿里云全面进军IoT的战略宣布之外&#xff0c;持续不断的生态签约成了另一大亮点&#xff1a;全天的IoT合伙作伴签约&#xff0c;围绕“ET大脑”的…

人工智能方案设计——基于事件图谱的类案同判

重点说明&#xff0c;此篇人工智能方案设计已获奖&#xff0c;如要转载&#xff0c;必须说明出处&#xff0c;谢谢合作。 基于事件图谱的类案同判 项目简介&#xff1a; 意义&#xff1a; 现今&#xff0c;针对现有的案多法官少的情况&#xff0c;我们采用基于事件图谱的类…

科大讯飞市值腰斩背后,AI产业集体思考如何落地?

作者丨郭敏 本文经授权转载自钛媒体&#xff08;ID&#xff1a;taimeiti&#xff09; 【导语】在过去的一年里&#xff0c;科大讯飞受到了多方质疑&#xff0c;质疑的声音不外乎盈利疲软、靠政府补助、技术优势逐渐变弱等&#xff0c;种种质疑背后&#xff0c;其实整个 AI 产业…

FTP上传网页显示不了图片

FTP上传网页显示不了图片 刚上班不久,昨天用FTP上传了一个网页,可是图片显示不出来 检查了图片地址 针对图片的地址做了仔细的检查,并没有错误,一时让我摸不着头脑图片不是绝对地址 ;图片为png,jpg格式; 1.图片名没有中文命名;图片没有破损; 2.图片大小符合网站规定…

数据中台、标签、数据资产相关的15个名词解释(文末赠书)

公众号后台回复“图书“&#xff0c;了解更多号主新书内容导读&#xff1a;本文将对数据中台、数据、标签相关的关键名词术语进行定义和解释。 作者&#xff1a;任寅姿 季乐乐 来源&#xff1a;大数据DT&#xff08;ID&#xff1a;hzdashuju&#xff09; 01 数据 数据是指对客观…

详解数据资产的8大重要特征

导读&#xff1a;原始数据加工成标签&#xff0c;即可认为是简单意义上的数据资产化过程。 数据不再是业务、信息系统的记录或存储&#xff0c;而是转化成带有商业价值的标签&#xff0c;标签是具有业务含义或对业务有指导意义的数据定义&#xff0c;可以说&#xff0c;完成了标…

什么是标签?跟数据中台有什么关系?终于有人讲明白了

导读&#xff1a;本文带你了解标签在数据中台中的位置。 作者&#xff1a;任寅姿 季乐乐 来源&#xff1a;大数据DT&#xff08;ID&#xff1a;hzdashuju&#xff09; 01 什么是标签 标签指从原数据加工而来&#xff0c;能够直接为业务所用并产生业务价值的数据载体。从本质上讲…

数据中台:前台调用能快速响应、数据口径一致

标签类目体系方法有什么用处&#xff1f; 标签类目体系方法有什么用处&#xff1f;对企业来说究竟有什么好处&#xff1f;企业数据部门人员经常会对标签类目体系存在的意义产生疑问。如果不建设标签类目体系&#xff0c;用传统的数仓建模是否也可以&#xff1f;数据部门负责人在…

数据中台、标签、数据资产相关的15个名词解释

导读&#xff1a;本文将对数据中台、数据、标签相关的关键名词术语进行定义和解释。 作者&#xff1a;任寅姿 季乐乐 来源&#xff1a;大数据DT&#xff08;ID&#xff1a;hzdashuju&#xff09; 01 数据 数据是指对客观事件进行记录并可以鉴别的符号&#xff0c;是对客观事物的…

关于XML解析报错问题(LF、CRLF)

报错内容的主要部分&#xff1a; UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 123: illegal multibyte sequence 问题产生 在做目标检测时&#xff0c;使用的数据集来自网络&#xff0c;在将xml和图片转换到特定格式时&#xff0c;有些xml文件解析…

《扬帆优配》新增21亿订单,海风龙头获多路资金抢筹!

今天仅三个职业获主力资金净流入。 证券时报数据宝计算&#xff0c;今天沪深两市主力资金净流出295.18亿元&#xff0c;其间创业板净流出76.61亿元&#xff0c;沪深300成份股净流出92.15亿元。 申万一级职业中&#xff0c;今天传媒、电子、有色金属等6个职业上涨。25个跌落职业…

通达海深交所上市:市值51亿 2022年净利降8%

雷递网 雷建平 3月20日 南京通达海科技股份有限公司&#xff08;简称&#xff1a;“通达海”&#xff0c;证券代码&#xff1a;301378&#xff09;今日在深交所创业板上市。 通达海本次发行1150万股&#xff0c;发行价为95元&#xff0c;募集资金10.93亿元。 通达海开盘价为110…

通达海:一直推进人工智能在法院具体业务场景应用方面的研究

导读&#xff1a;通达海近期接受投资者调研时称&#xff0c;公司也一直在推进人工智能在法院具体业务场景应用方面的研究&#xff0c;包括立案风险预警、要素信息抓… 通达海近期接受投资者调研时称&#xff0c;公司也一直在推进人工智能在法院具体业务场景应用方面的研究&…

马斯克“翻车”现场:“甩”不掉的推特

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 自上周五宣布终止对推特的收购以来&#xff0c;马斯克再次成为科技网站的首页“常驻嘉宾”。 面对马斯克意欲违约并想把责任推得干干净净后&#xff0c;推特显然也不是“吃素的”&#xff1a;仍将致力…

用nltk模仿海子写中文现代诗

文章目录 前言开始编程寻找素材处理语料一些类似的步骤 运行结果 前言 仅仅写英文诗还不够&#xff0c;我们又把主意打到了中文诗头上。不过要写古体诗还有一些困难&#xff0c;我们先尝试一下现代诗。 写中文现代诗的代码与英文诗类似&#xff0c;区别主要在语料的处理上&am…

OpenAI的ChatGPT、微软的New Bing、百度的文心一言、Google的Bard、阿里云的通义千问

随着 ChatGPT 热潮卷起来&#xff0c;微软发布New Bing、百度发布了文心一言、Google 发布了 Bard&#xff0c;阿里云官方终于也宣布了&#xff0c;旗下的 AI 大模型“通义千问”也正式开启测试&#xff01; ChatGPT ChatGPT是一种由OpenAI训练的大型语言模型。它的原理是基于…