新博文地址:[leetcode]Permutations
Given a collection of numbers, return all possible permutations.
For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].
For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].
给你一个数组,求该数组的排列。
如果不了解排列的话,最好先去熟悉一下排列组合的相关概念,对于n个数来说,其排列数组一共有n!种情况,简单起见,我们假设 n-1个数的排列情况已经知道了,
例如[1,2]的排列情况一共有2种[1,2],[2,1],则添加3的时候,要注意对每个数组,3的位置都有三种情况,比如对于[1,2]来讲,□1□2□,3可能出现在三个方框显示的位置,因此就有三种情况,[3,1,2]、[1,3,2]、[1,2,3]同理[2,1]插入3之后也有三种情况,而且,这6种情况不会有交集,因为1,2的顺序已经限定了,前三种和后三种必定没有交集
既然这种思想要求我们知道n-1个数的排列情况,那么就可以用两种算法来实现:
1. 自底向上的递推
2. 自顶向下的递归
loop算法:
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); public ArrayList<ArrayList<Integer>> permute(int[] num){ if(num == null || num.length == 0){ return result; } ArrayList<Integer> tem = new ArrayList<Integer>(); tem.add(num[0]); result.add(tem); for(int i = 1; i < num.length; i++ ){//自底向上进行递推 int n = num[i]; int count = 0; for(; count < factorial(i);count++){ ArrayList<Integer> list = result.get(count); generateNewLists(list,n); } for(count = 0 ; count < factorial(i); result.remove(0),count++);//删除旧节点 } return result; } private int factorial(int n){//计算n的阶乘 int result = 1; for(int i = 1; i <= n; result *= i,i++); return result; } private void generateNewLists(ArrayList<Integer> list ,int n){//由n-1的排列,插入n之后形成新的排列 int size = list.size(); for(int i = 0; i <= size; i++){ ArrayList<Integer> newList = new ArrayList<Integer>(); int num = 0; for(int j = 0; j < list.size(); j++){ if(num == i){ newList.add(n); } newList.add(list.get(j)); num++; } if(i == size){ newList.add(n); } result.add(newList); } }
递归版本(大致思想差不多,只是实现上的区别,递归代码稍微短一点,但是效率略低)
public ArrayList<ArrayList<Integer>> permuteWithCursor(int[] num){ if(num == null || num.length == 0){ return new ArrayList<ArrayList<Integer>>(); } return dfs(num,num.length - 1); } public ArrayList<ArrayList<Integer>> dfs(int[] num,int n ){ ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); if(n == 0){ ArrayList<Integer> list = new ArrayList<Integer>(); list.add(num[n]); result.add(list); return result; } ArrayList<ArrayList<Integer>> prePermutation = dfs(num,n - 1); for(ArrayList<Integer> list : prePermutation){ int size = list.size(); for(int i = 0; i <= size; i++){//具体实现与loop版本相同 ArrayList<Integer> newList = new ArrayList<Integer>(); int count = 0; for(int j = 0; j < list.size(); j++){ if(count == i){ newList.add(num[n]); } newList.add(list.get(j)); count++; } if(i == size){ newList.add(num[n]); } result.add(newList); } } return result; }
相关推荐
Source file for LeetCode Permutations Problem
c语言入门 C语言_leetcode题解之46-permutations.c
js js_leetcode题解之46-permutations.js
c语言入门 C语言_leetcode题解之47-permutations-ii.c
js js_leetcode题解之47-permutations-ii.js
LeetCode第46题,题目要求根据给定的整数集合,返回所有可能的排列组合。这个问题属于组合数学与算法设计的范畴,主要考察的是全排列的生成。 【解题思路】 1. **递归算法**:递归方法是从剩余未使用的元素中选择...
- Permutations / Permutations II: 生成所有可能的排列组合,考虑重复元素的情况。 - Rotate Image: 给定一个二维矩阵,将它顺时针旋转90度。 - Group Anagrams: 组合所有字母异位词,即将字母顺序不同但字母组合...
permutations2.py - 返回所有可能的唯一排列 3sum_2.py - 查找数组中所有唯一的三元组,其总和为零。 3sum.py - 查找数组中所有唯一的三元组,其总和为零。 first_last_pos_array.py - 找到给定目标值的开始和结束...
leetcode怎么销号 LeetCode-Solutions :green_heart:My own LeetCode solutions No. Problem LeetCode 力扣 Python Go Solution Difficulty Tag 0017 Letter Combinations of a Phone Number Medium 回溯、暴力 0034...
leetcode怎么计算空间复杂度是指 LeetCode-Solution my first solution of LeetCode 2015-5-7 Problem 95,98(80 already!) 我经常在递归的结束地方忘记return!!! 题型一:经典暴力递归:(里面涉及到重复不重复的...
leetcode 2 LeetCode - 30 Days 前言 相信所有写程式的人在面试前,总是在揣测在白板题会被问到什么问题,而我们最常听到的准备方式就是“刷”。上有数百个可能是面试官问你的题目,我把它...Permutations 目录 ref:
LeetCode 算法题解析 从给定的文件信息中,我们可以看到,这是一个关于 LeetCode 算法题的知识点总结。下面我们将对标题、描述、标签和部分内容进行详细的解析和总结。 标题:leetcode1-300.docx 这个标题表明了...
leetcode 轮廓 1_count_and_say.cpp - super_ugly_number.cpp - Detect_Pattern.cpp - degree_of_array.cpp - 键盘.cpp - 2Sum_Data_Structure_Design.cpp - shuffle_array.cpp - permutations.cpp - kth_missing_...
permutations import random import itertools import collections from fractions import Fraction from collections import Counter import operator import re from functools import reduce from collections ...
本资源包聚焦于LeetCode的第46题,名为"全排列"(Permutations)。这道题目要求我们找到所有可能的排列方式,对于一个给定的没有重复数字的数组。解这类问题,我们可以使用回溯法或者深度优先搜索(DFS)策略来完成...
在本资源包"C语言入门-leetcode练习之第46题全排列.zip"中,主要涵盖了C语言的基础知识以及如何利用C语言解决算法问题的实践,特别是针对LeetCode平台上的第46题——全排列(Permutations)的解题方法。全排列问题是...
6. **回溯法**:如“全排列”(Permutations),要求列出所有可能的数组排列。 7. **堆和队列**:如“最小覆盖子集”(Minimum Size Subarray Sum),需要找到使数组元素和大于等于给定目标的最小子数组长度。 每个...
- 使用`itertools`模块提供的工具函数,如`combinations()`, `permutations()`等,处理组合和排列问题。 - 应用动态规划、贪心算法、回溯法等算法思想,解决复杂问题。 4. **'leetcode2-master'项目**: - '...
6. **回溯**:如“全排列”(Permutations),使用回溯算法找出所有可能的排列组合。 在阅读和学习这些解决方案时,你可以深入了解每种数据结构和算法的工作原理,并学习如何在 TypeScript 中有效地实现它们。同时...