leetcode刷题笔记四十六 全排列

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)
        }
      }
    }
}
posted @ 2020-07-02 22:10  ganshuoos  阅读(109)  评论(0编辑  收藏  举报