首页 > 试题广场 >

没有重复项数字的全排列

[编程题]没有重复项数字的全排列
  • 热度指数:83191 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给出一组数字,返回该组数字的所有排列
例如:
[1,2,3]的所有排列如下
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1].
(以数字在数组中的位置靠前为优先级,按字典序排列输出。)

数据范围:数字个数
要求:空间复杂度 ,时间复杂度
示例1

输入

[1,2,3]

输出

[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例2

输入

[1]

输出

[[1]]
头像 LaN666
发表于 2021-07-18 23:19:45
精华题解 题目思路:这道题目就是很典型的回溯类题目。回溯其实也是暴力解法,但是又一些题目可以通过剪枝对算法进行优化,这道题目要找出所有的排列,其实还是比较简单的。算法的思路主要就是:选择与撤销例如:1开头的有,[1,2,3],接着3撤销,2撤销,然后选择3,再选择2,就有了[1,3,2]。整体用一个图来观看整 展开全文
头像 牛客题解官
发表于 2022-04-22 12:28:38
精华题解 题目主要信息: 给定一个数组,求这组数字的全排列 数组无重复元素 以数字在数组中的位置靠前为优先级,按字典序排列输出 举一反三: 学习完本题的思路你可以解决如下题目: BM56. 有重复项数字的全排列 BM58. 字符串的排列 BM60. 括号生成 递归+回溯(推荐使用) 知识点:递归与回溯 递 展开全文
头像 tompai
发表于 2022-01-18 16:26:11
>"> public ArrayList<ArrayList<Integer>> permute(int[] num) { // 存一种排列 LinkedList<Integer> list = new LinkedList& 展开全文
头像 牛客281174060号
发表于 2022-04-02 19:14:34
这一题看着简单但是写起来一下子还找不到思路,看了下题解也无法一下子理解,大家的方法都比较抽象,花了很久才想出直观的解决该题的思路。 解决算法如下所示: 把第一个元素取出来,记作a; 递归解决剩下的list的全排列,得到结果为[[...],[...],...,]; 对于得到的结果进行遍历,然后将元素 展开全文
头像 牛客696655490号
发表于 2022-06-18 23:23:12
今天华为机考遇到了这题, ( 非一样,不过知识点一样,相当于题目加了个拟定情境,感觉拟定情况推断解决方法.其中一题的要求就是做到顺序全排列. ) // 递归求全排列 void func( int *num, // 输入 一维数组 int **Res, // 输出 一维数组 展开全文
头像 华科不平凡
发表于 2020-09-01 09:56:03
两种思路(均基于回溯): 用数组记录已访问过的元素 利用交换 利用数组记录已访问过的元素 // // Created by jt on 2020/8/31. // #include <vector> using namespace std; class Solution { pub 展开全文
头像 Virtual~
发表于 2022-03-02 20:45:30
Python 回溯写法 # 伪代码: def 回溯函数(): if (满足条件): 保存结果(patch[:]在此处为拷贝引用,否则输出会为空) for i in (列表选择): 选取操作,记录该选择 回溯() 撤销操作 完整代 展开全文
头像 Fadeways
发表于 2022-03-09 14:02:00
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而 展开全文
头像 youxiwang
发表于 2022-03-07 06:41:50
就暴力递归 + 回溯(省空间) 每次递归, 从小到大(所以一上来要对num进行排序)遍历待选的数, 选到的数从remain中删除,并插入perm中。 O(n!) O(n!) import java.util.*; public class Solution { ArrayList< 展开全文
头像 摸鱼学大师
发表于 2021-12-07 10:07:57
题目的主要信息: 给出一组数字,返回该组数字的所有排列 数字无重复 以数字在数组中的位置靠前为优先级,按字典序排列输出 方法一:递归 具体做法: 可以通过递归,每次递归对每个下标的元素与它后面每个元素交换位置成为一种排列的情况,当下标到了数组结尾即可认为一种排列加入答案中。当某一种交换的结果经过 展开全文
头像 木子梨丶
发表于 2022-08-05 18:36:39
return list(itertools.permutations(nums))
头像 Sousey
发表于 2022-09-18 19:40:48
这个解法是通过递归实现。不太简单(对我来说),hhh最主要的是,他的自测的结果是错的,让我盯了好一会,我以为是我错了,,还让我认真的在看了好久的答案解法。。。 class Solution { public: void recursion(vector<vector<int&g 展开全文