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

055全排列

全排列题目链接https://leetcode.cn/problems/permutations/description/?envTypestudy-plan-v2envIdtop-100-liked我的解答无分析自己没什么思路。看了官方题解后的解答//只看思路自己编码版 //方法回溯 //时间复杂度O(n*n!) //空间复杂度O(n) ListListInteger ans; public ListListInteger permute(int[] nums) { ans new ArrayList(); int n nums.length; ListInteger output new ArrayList(n); backtrack(nums, output, 0, n); return ans; } //output存储每次排列的结果 //index记录nums数组中还未被使用的第一个元素的下标[0,index-1]为已经被使用过的元素[index,n-1]为还未被使用过的元素 public void backtrack(int[] nums, ListInteger output, int index, int n){ int oLen output.size(); if(n oLen){ ans.add(new ArrayList(output)); return; } for(int iindex; in; i){ output.add(nums[i]); swap(nums, index, i);//将使用过的数据移动至index指向的位置 backtrack(nums, output, index 1, n); //回溯 swap(nums, index, i); output.remove(oLen); } } public void swap(int[] nums, int x, int y){ int temp nums[x]; nums[x] nums[y]; nums[y] temp; } //看了官方解答版 //方法回溯 //时间复杂度O(n*n!) //空间复杂度O(n) public ListListInteger permute(int[] nums) { ListListInteger ans new ArrayList(); ListInteger output new ArrayList(); for(int num : nums){ output.add(num); } int n nums.length; backtrack(output, n, 0, ans); return ans; } //first为output集合中未被使用过的第一个元素的下标 //在output集合中[0,first-1]为已经排列好的元素[first,n-1]为还未被排列的元素 public void backtrack(ListInteger output, int n, int first, ListListInteger ans){ //所有数都填完了 if(first n){ //收集答案 ans.add(new ArrayList(output)); return; } for(int ifirst; in; i){ //动态维护数组 Collections.swap(output, i, first); //继续递归填下一个数 backtrack(output, n, first 1, ans); //撤销操作 Collections.swap(output, i, first); } }分析​ 1、解题思路通过递归为每个位置填入一个还未被使用过的元素官方题解先将nums数组的数据复制一份到output集合中用变量first维护output集合中还未被排列过的元素即在output集合中[0,first-1]为已经被排列好的元素[first,n-1]为还未被排列的元素。之后只需动态维护output集合并在n个元素全都排列好后收集答案即可。​ 2、在本次解答中官方题解通过每次排列后将元素位置进行变换并用一个变量first维护第一个未被排列过的元素的位置使得集合中[0,first-1]为已经被排列好的元素[first,n-1]为还未被排列的元素这样生成的全排列并不是按字典序存储在答案数组中的如果题目要求按字典序输出那么则需使用标记数组或者其他方法来维护元素状态。总结本题采用回溯方法解题其中需要注意每次搜集答案时需重新创建一个集合并将得到的排列复制到新建的集合中。本题通过变量first和动态维护数组来区分未被使用过的元素和已经被使用过的元素所以得到的答案不是按字典序存储的如果题目要求按字典序输出那么则需使用标记数组或者其他方法来维护元素状态。
http://www.rkmt.cn/news/1384948.html

相关文章:

  • 零基础转行网络安全!通俗拆解行业岗位、能力要求与发展路径
  • 大佬推荐的网络安全学习路线(从基础到高级,超级详细)
  • AI圈神秘领袖Ilya一幅画引爆全网,OpenAI三件大事暗示AGI时代将至?
  • 集成学习在房价预测中的应用:从原理到实战调优
  • 【Unity编辑器拓展】实现ScriptableObject的结构体结构中,枚举变量显示中文描述
  • 不止于采样:深度挖掘英飞凌Aurix EVADC的硬件触发与高级仲裁机制
  • APIfox自动化测试实战:如何用后置脚本实现接口间数据传递(含公共断言脚本写法)
  • 为Claude Code配置Taotoken解决访问不稳定与Token不足难题
  • 毕业设计:基于java的在线问卷调查系统的设计与实现(源码)
  • 2026年第20周最热门的开源项目(Github)
  • Android 高频面试题汇总,26 道经典考题轻松应对面试
  • Airtest Poco实战:5分钟搞定微信小程序自动化测试环境搭建与元素抓取
  • 关联规则挖掘在Calabi-Yau流形Hodge数分析中的应用与复现
  • 优化器偷偷做了什么:一次子查询消除让我从32秒等到24毫秒
  • 别再乱点屏幕了!用Monkey黑白名单精准测试你的Android App(附完整配置文件)
  • 第三卷第4章:原型模式设计思想
  • Godot4 2D游戏开发避坑指南:TileMap绘制、节点顺序与相机设置的三个常见问题
  • 5分钟精通SPT-AKI存档编辑器:离线塔科夫终极修改指南
  • 基于MAX78000的医疗紧急呼叫系统:边缘AI与低功耗设计实战
  • 从零构建:深入理解Linux启动过程
  • 2026年业务分析报告服务TOP5深度测评:报告生成能力与落地效果全对比 - 科技焦点
  • 电信运营商每月处理海量工单,如何不再出错?基于AI Agent的端到端自动化解决方案
  • UE5 Mac环境搭好了,然后呢?给新手的第一个5分钟:创建、操控并理解你的第一个角色
  • Stylized Clouds Pack技术解析:卡通云朵的Shader架构与URP性能优化
  • 用了ChatGPT写论文初稿,如何降低AI率并同步减少文字重复率?
  • PDF4QT:免费开源的PDF全能工具箱,轻松处理各类文档难题
  • 不止是随机播放:用Unity VideoPlayer做个简易的广告机或展厅视频轮播系统
  • 简单学习 --> KV Cache
  • 简单学习 --> GPT架构
  • 从‘Hello World’到数据迁移:KingbaseES类型转换的5个高频实战场景解析