leetcode刷题笔记四十六 全排列
源地址:46. 全排列
问题描述:
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
代码补充:
//结合DFS与回溯法
//res => 存储排列结果
//path => 记录单次遍历的路径
//used => 记录本次遍历使用过的节点
//全排列过程实际是进行一次深度遍历的过程
//length => 目标长度,构成排列的高度
//depth => 目前遍历的层次,树高
import scala.collection.mutable
object Solution {
def permute(nums: Array[Int]): List[List[Int]] = {
val length = nums.length
if (length == 0) return List()
var res = mutable.ListBuffer[List[Int]]()
var path = mutable.ListBuffer[Int]()
var used = mutable.Set.empty[Int]
dfs(nums, length, 0, path, used, res)
return res.toList
}
def dfs(nums:Array[Int], length:Int, depth:Int, path:mutable.ListBuffer[Int], used:mutable.Set[Int], res:mutable.ListBuffer[List[Int]]) : Unit = {
//完成一次遍历,将结果保存于res中,返回
if (depth == length) {
res += (path.toList)
return
}
for(i <- nums.indices){
//当前结果尚未遍历
if(used.contains(nums(i)) == false){
//路径更新,使用节点更新
path += nums(i)
used += nums(i)
//接着遍历下一个未访问过的节点
dfs(nums, length, depth+1, path, used, res)
//回溯
path -= nums(i)
used -= nums(i)
}
}
}
}