zoukankan      html  css  js  c++  java
  • 全排列

    题目:

    给定一个 没有重复 数字的序列,返回其所有可能的全排列。

    示例:
    输入: [1,2,3]
    输出:
    [
      [1,2,3],
      [1,3,2],
      [2,1,3],
      [2,3,1],
      [3,1,2],
      [3,2,1]
    ]

    解题思路:

    回溯算法实际上一个类似枚举的搜索尝试过程,
    在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,
    就“回溯”返回,尝试别的路径框架:
    result = []
    def backtrack(路径, 选择列表):
        if 满足结束条件:
            result.add(路径)
            return
        
        for 选择 in 选择列表:
            做选择
            backtrack(路径, 选择列表)
            撤销选择
    代码:
    /go
    // 返回结果
    var result [][]int
    
    // 回溯核心
    // nums: 原始列表
    // pathNums: 路径上的数字
    // used: 是否访问过
    func backtrack(nums, pathNums []int, used[]bool) {
     // 结束条件:走完了,也就是路径上的数字总数等于原始列表总数
     if len(nums) == len(pathNums) {
      tmp := make([]int, len(nums))
      // 切片底层公用数据,所以要copy
      copy(tmp, pathNums)
      // 把本次结果追加到最终结果上
      result = append(result, tmp)
      return
     }
    
     // 开始遍历原始数组的每个数字
     for i:=0; i<len(nums); i++ {
      // 检查是否访问过
      if !used[i] {
       // 没有访问过就选择它,然后标记成已访问过的
       used[i] = true
       // 做选择:将这个数字加入到路径的尾部,这里用数组模拟链表
       pathNums = append(pathNums, nums[i])
       backtrack(nums,pathNums,used)
       // 撤销刚才的选择,也就是恢复操作
       pathNums = pathNums[:len(pathNums) -1]
       // 标记成未使用
       used[i] = false
      }
     }
    }
    
    func permute(nums []int) [][]int {
     var pathNums []int
     var used = make([]bool, len(nums))
      // 清空全局数组(leetcode多次执行全局变量不会消失)
      result = [][]int{}
     backtrack(nums, pathNums, used)
     return result
    }
    

      地址:https://mp.weixin.qq.com/s/DFZ59CfvWlxlxbuB7sgkRw

  • 相关阅读:
    前端面试题
    【429】关于ADT的访问权限
    【428】Dijkstra 算法
    【427】Graph 实现 以及 DFS & BFS
    【426】C 传递数组给函数
    【425】堆排序方法(二叉堆)优先队列(PQ)
    Hadoop案例(九)流量汇总案例
    Hadoop案例(八)辅助排序和二次排序案例(GroupingComparator)
    Hadoop案例(七)MapReduce中多表合并
    Hadoop案例(六)小文件处理(自定义InputFormat)
  • 原文地址:https://www.cnblogs.com/smallleiit/p/13753334.html
Copyright © 2011-2022 走看看