LCR 083. 全排列
创始人
2024-11-16 03:04:26
0

题目

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

示例 1:

输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 

示例 2:

输入:nums = [0,1] 输出:[[0,1],[1,0]] 

示例 3:

输入:nums = [1] 输出:[[1]] 

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

解法

分享一下复杂的解法

思路:全排列可以看做在确定的列表上加一个数字,比如[1,2,3]可以看做在[1,2]中加入3,而[1,2]可以看做[1]中加入2。因此,可以定义一个函数,这个函数的作用是每次在自身列表中加入一个数字并且它会调用自己,就能得到一个不停给自己加入数字的列表。

    def pailie(self, nums, stack):         # print(stack)         if len(stack) == len(nums):             self.res.append([nums[x] for x in stack])             return         i = stack[-1]         while i < len(nums)-1:             stack.append(i+1)             self.pailie(nums, stack)             stack.pop()             i += 1
# 伪代码 for i in range(nums):     self.pailie(nums, [i])

用列表操作来模拟栈的进出, 注意:栈里边存的是元素下标。上述代码步骤拆分后是这样的,每行代表一次pailie函数执行完毕,为了清楚一点就直接写值了,实际上stack里边存的是下标:

[1] -> [1,2] -> [1,2,3]

[1] -> [1,3]

[2] -> [2,3]

[3]

排列在往列表中加入数字时不仅要考虑后边的元素,也要考虑前边的元素,同时不能选择重复的元素,因此要创建status列表记录每个元素是否被使用

    def pailie(self, nums, stack, status):         # print(stack)         if len(stack) == len(nums):             self.res.append([nums[x] for x in stack])             return         i = stack[-1]         while i < len(nums)-1:             if status[i+1] == 0:                 status[i+1] = 1                 stack.append(i+1)                 self.pailie(nums, stack, status)                 status[i+1] = 0                 stack.pop()             i += 1         i = stack[-1]         while i > 0 :             if status[i-1] == 0:                 status[i-1] = 1                 stack.append(i-1)                 self.pailie(nums, stack, status)                 status[i-1] = 0                 stack.pop()             i -= 1
# 伪代码         status = [0] * len(nums)         for i in range(len(nums)):             status[i] = 1             self.pailie(nums, [i], status)             status[i] = 0         return self.res

上述代码步骤拆分后是这样的:

[1] -> [1,2] -> [1,2,3]

[1] -> [1,3] -> [1,3,2]

[2] -> [2,3] -> [2,3,1]

[2] -> [2,1] -> [2,1,3]

[3] -> [3,2] -> [3,2,1]

[3] -> [3,1] -> [3,1,2]

总结

时间复杂度应该是O(n^n), 不适合元素很大的情况。

官方的解法还是比较好的。

相关内容

热门资讯

分享一款!江汉晃晃辅助器,同城... 分享一款!江汉晃晃辅助器,同城510k修改,要领教程(有挂方式)1、每一步都需要思考,不同水平的挑战...
让我来分享经验!天天贵阳游戏辅... 让我来分享经验!天天贵阳游戏辅助,哥哥打大a有辅助吗,模板教程(有挂助手)1、不需要AI权限,帮助你...
玩家必看分享!龙岩优优辅助,衢... 玩家必看分享!龙岩优优辅助,衢州都莱辅助器,妙招教程(真的有挂)1、让任何用户在无需龙岩优优辅助安装...
终于懂了!手机游戏挂机辅助软件... 终于懂了!手机游戏挂机辅助软件,传送屋激k看底牌辅助软件,练习教程(有挂功能)进入游戏-大厅左侧-新...
玩家必看科普!胡乐情怀宜春外挂... 玩家必看科普!胡乐情怀宜春外挂,同城乐吧乐享版510k辅助,总结教程(有挂攻略)1、首先打开胡乐情怀...
推荐一款!微信三哥玩辅助器,浙... 推荐一款!微信三哥玩辅助器,浙江游戏大厅修改器,学习教程(有挂头条)该软件可以轻松地帮助玩家将微信三...
玩家攻略!凑一桌游戏软件下载辅... 玩家攻略!凑一桌游戏软件下载辅助,新518互游插件,法子教程(的确有挂)1、许多玩家不知道凑一桌游戏...
玩家爆料!湖北卡五星辅助软件,... 玩家爆料!湖北卡五星辅助软件,蜀山四川小程序破解版,练习教程(有挂详情)蜀山四川小程序破解版能透视中...
教程攻略!黑科技微乐小程序辅助... 教程攻略!黑科技微乐小程序辅助器免费,战神辅助官网,操作教程(有挂总结)该软件可以轻松地帮助玩家将黑...
重大推荐!随意玩辅助器视频有挂... 重大推荐!随意玩辅助器视频有挂,欢乐茶馆免费辅助设置,手册教程(发现有挂)随意玩辅助器视频有挂脚本下...