美文网首页
dart实现 leetcode46全排列

dart实现 leetcode46全排列

作者: 锦鲤跃龙 | 来源:发表于2020-11-23 07:48 被阅读0次

[toc]

题目:https://leetcode-cn.com/problems/permutations/

思路

利用回溯排列


image.png

代码


class Solution {
  List<List<int>> res; //最后的结果
  List<bool> used; //已经用到的
  List<int> path; //记录成功的一条
  List<List<int>> permute(List<int> nums) {
    int len = nums.length;
    res = new List();
    if (len == 0) {
      return res;
    }
    used = List(len);
    path = List<int>();
    dfs(nums, 0);
    return res;
  }

  void dfs(
    List<int> nums,
    int depth,
  ) {
    int len = nums.length;
    if (depth == len) {
      res.add(List.from(path)); //因为是指针传递,所以复制一份出来
      return;
    }
    for (int i = 0; i < len; i++) {
      if (used[i] != true) {
        path.add(nums[i]);
        used[i] = true;
        // print('递归之前 =>$path');
        dfs(nums, depth + 1);
        //回溯 回复现场
        used[i] = false;
        path.removeLast();
        // print('递归之后 i=$i =>$path');
      }
    }
  }
}

验证

main(List<String> args) {
  List<int> nums = [1, 2, 3];
  Solution s = Solution();
  print(s.permute(nums));
}

结果

[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

复杂度分析

回溯算法由于其遍历的特点,时间复杂度一般都比较高,有些问题分析起来很复杂。一些回溯算法解决的问题,剪枝剪得好的话,复杂度会降得很低,因此分析最坏时间复杂度的意义也不是很大。但还是视情况而定。

  • 时间复杂度:O(n*n!)
  • 空间复杂度 O(n*n!)

时间复杂度分析

  • 在第 1 层,结点个数为 N个数选 1 个的排列
  • 在第 2 层,结点个数为 N个数选 2 个的排列
    所以:非叶子节点个数
    1+\sideset{}{^1_{n}}A +\sideset{}{^2_{n}}A +\sideset{}{^3_{n}}A +... +\sideset{}{^{n-1}_{n}}A
    = 1+n!/(n-1)! +n!/(n-2)! +n!/(n-3)! +... +n!

因为 n!/(n-1)! +n!/(n-2)! +n!/(n-3)! +... +n!
= n!*(1/(n-1)! +1/(n-2)! +1/(n-3)! +... +1)
<= n!*(+1/2 +1/4 +1/8 +... +1/(2^n-1))<2N!

将常规系数2视为1,每个内部循环N次,故非叶子时间复杂度为O(n*n!)

相关文章

  • dart实现 leetcode46全排列

    [toc] 题目:https://leetcode-cn.com/problems/permutations/[h...

  • LeetCode46——全排列问题

    题目描述 给定一个不含重复数字的数组 nums ,返回其所有可能的全排列 。你可以按任意顺序返回答案。46. 全排...

  • 全排列与字典序

    全排列 递归实现全排列; 首先来说递归算法实现全排列: 例如,对于{1,2,3,4}的例子进行全排列,其可以分解...

  • 全排列与全组合

    递归+交换值实现全排列 非重复的全排列 位运算实现全组和

  • 回溯算法 - 全排列算法实现(python&dart)

    回溯算法 , 就是 穷举 解决一个回溯问题,实际上就是一个决策树的遍历过程. 路径: 也就是已经做出的选择 选择列...

  • 全排列的一种实现

    全排列的一个实现。

  • 全排列

    回溯实现全排列 给定一组数,如:1,2,3。编程实现全排列形式:123,132,213,231,312,321

  • 几种计算全排列的方法

    基于golang实现,有非并发实现和并发实现 递归 全排列问题,比如打印1-9的共9个字母的全排列。先输出1,然后...

  • Haskell 实现全排列

    用Haskell语言实现一个全排列,我们使用递归的思想: 定义这个函数名为permute :: [a] -> [[...

  • Java实现全排列

    ①假设全排列函数为f(n)=n!,那么可以立刻知道f(n+1)=(n+1)Xn!=(n+1)*f(n),因此可以利...

网友评论

      本文标题:dart实现 leetcode46全排列

      本文链接:https://www.haomeiwen.com/subject/dekmiktx.html