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

leetcode 46. Permutations(排列)

在这里插入图片描述
返回数组nums中数字的所有可能的排列组合。

思路:

排列组合这种一般会想到DFS。

这个排列中每个数字只能用一次,
可用如下DFS流程

stack.push(num);
dfs(nums, num);
stack.pop();

退出条件:
当stack的size和nums数组一样时,说明已经完成了一个排列组合,保存结果退出当前dfs。
否则遍历数组,进入新一轮dfs.

每个数字只能用一次,所以用一个visited数组记录数字是否已经使用过。

class Solution {List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> permute(int[] nums) {Stack<Integer> st = new Stack<>();boolean[] visited = new boolean[nums.length];dfs(nums, st, visited);return res;}void dfs(int[] nums, Stack<Integer> st, boolean[] visited){if(st.size() == nums.length) {List<Integer> list = new ArrayList<>(st);res.add(list);return;}//combinationfor(int i = 0; i < nums.length; i++) {if(visited[i]) continue;st.push(nums[i]);visited[i] = true;dfs(nums, st, visited);st.pop();visited[i] = false;}}
}

也可以不用stack. 直接在nums数组上模拟stack.
把需要装入stack的数字交换到前面,用一个指针模拟栈顶。
此方法更快。

class Solution {List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> permute(int[] nums) {solve(nums, 0);return res;}void solve(int[] nums, int start){if(start == nums.length-1) {List<Integer> list = new ArrayList<>();for(int num : nums) list.add(num);res.add(list);return;}//combinationfor(int i = start; i < nums.length; i++) {swap(nums, start, i);solve(nums, start+1);swap(nums, start, i);}}void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}
http://www.lryc.cn/news/107277.html

相关文章:

  • 5、二叉树
  • Doris比MySQL快的原因
  • Prometheus + Grafana安装
  • 二十三种设计模式第二十一篇--解释器模式
  • PHP8的数据类型转换-PHP8知识详解
  • 2023 电赛 E 题 K210 方案
  • Python的正则表达式re模块的compile()方法有什么作用?
  • SQL 语句中 left join 后用 on 还是 where,区别大了!
  • uni-app 微信小程序自定义导航栏
  • 电缆故障检测仪技术参数
  • 固定资产管理软件
  • 云安全攻防(四)之 云原生技术
  • 线上通过Nginx部署前端工程,并且配置SSL
  • 直播预告 | 开源运维工具使用现状以及可持续产品的思考
  • GPT带我学-设计模式-工厂模式
  • Docker 安装 Tomcat
  • seata注册到nacos(docker)
  • ffmpeg综合应用示例(五)——多路视频合并(Linux版本)
  • Node.js-http模块服务端请求与响应操作,请求报文与响应报文
  • 除了PS,还有那些软件可以打开PSD文件
  • uniapp h5支付宝支付后端返回Form表单,前端如何处理
  • 【华秋干货铺】PCB布线技巧升级:高速信号篇
  • c#:ObservableCollection<T>的用法
  • Linux 端口号占用如何处理(使用命令处理)
  • ubuntu git操作记录设置ssh key
  • SystemVerilog数组参数传递及引用方法总结
  • Shell脚本学习-While循环1
  • docker for Windows, WSL2 ,Hyper-v的关系
  • SAS-数据集SQL水平合并
  • 企业既要用u盘又要防止u盘泄密怎么办?