`
huntfor
  • 浏览: 201177 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[leetcode]Permutations

 
阅读更多

新博文地址:[leetcode]Permutations

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].

 给你一个数组,求该数组的排列。

如果不了解排列的话,最好先去熟悉一下排列组合的相关概念,对于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;
	}

 

 

分享到:
评论

相关推荐

    LeetCode Permutation

    Source file for LeetCode Permutations Problem

    C语言-leetcode题解之46-permutations.c

    c语言入门 C语言_leetcode题解之46-permutations.c

    js-leetcode题解之46-permutations.js

    js js_leetcode题解之46-permutations.js

    C语言-leetcode题解之47-permutations-ii.c

    c语言入门 C语言_leetcode题解之47-permutations-ii.c

    js-leetcode题解之47-permutations-ii.js

    js js_leetcode题解之47-permutations-ii.js

    leetcode 46. Permutations 迭代+递归 python3

    LeetCode第46题,题目要求根据给定的整数集合,返回所有可能的排列组合。这个问题属于组合数学与算法设计的范畴,主要考察的是全排列的生成。 【解题思路】 1. **递归算法**:递归方法是从剩余未使用的元素中选择...

    _leetcode-python.pdf

    - Permutations / Permutations II: 生成所有可能的排列组合,考虑重复元素的情况。 - Rotate Image: 给定一个二维矩阵,将它顺时针旋转90度。 - Group Anagrams: 组合所有字母异位词,即将字母顺序不同但字母组合...

    leetcode最大连通域-leetcode:leetcode

    permutations2.py - 返回所有可能的唯一排列 3sum_2.py - 查找数组中所有唯一的三元组,其总和为零。 3sum.py - 查找数组中所有唯一的三元组,其总和为零。 first_last_pos_array.py - 找到给定目标值的开始和结束...

    leetcode怎么销号-LeetCode-Solutions:我自己的LeetCode解决方案

    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:我的第一个LeetCode解决方案

    leetcode怎么计算空间复杂度是指 LeetCode-Solution my first solution of LeetCode 2015-5-7 Problem 95,98(80 already!) 我经常在递归的结束地方忘记return!!! 题型一:经典暴力递归:(里面涉及到重复不重复的...

    leetcode2-leetcode-30days:30天内写30个LeetCode

    leetcode 2 LeetCode - 30 Days 前言 相信所有写程式的人在面试前,总是在揣测在白板题会被问到什么问题,而我们最常听到的准备方式就是“刷”。上有数百个可能是面试官问你的题目,我把它...Permutations 目录 ref:

    leetcode1-300.docx

    LeetCode 算法题解析 从给定的文件信息中,我们可以看到,这是一个关于 LeetCode 算法题的知识点总结。下面我们将对标题、描述、标签和部分内容进行详细的解析和总结。 标题:leetcode1-300.docx 这个标题表明了...

    2sumleetcode-LeetCode:力码

    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_...

    leetcode双人赛-Leetcode:leetcode中问题的解答

    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 ...

    c++-c++编程基础之leetcode题解第46题全排列.zip

    本资源包聚焦于LeetCode的第46题,名为"全排列"(Permutations)。这道题目要求我们找到所有可能的排列方式,对于一个给定的没有重复数字的数组。解这类问题,我们可以使用回溯法或者深度优先搜索(DFS)策略来完成...

    C语言入门-leetcode练习之第46题全排列.zip

    在本资源包"C语言入门-leetcode练习之第46题全排列.zip"中,主要涵盖了C语言的基础知识以及如何利用C语言解决算法问题的实践,特别是针对LeetCode平台上的第46题——全排列(Permutations)的解题方法。全排列问题是...

    leetcode:LeetCode练习

    6. **回溯法**:如“全排列”(Permutations),要求列出所有可能的数组排列。 7. **堆和队列**:如“最小覆盖子集”(Minimum Size Subarray Sum),需要找到使数组元素和大于等于给定目标的最小子数组长度。 每个...

    leetcode2-leetcode2:leetcode2

    - 使用`itertools`模块提供的工具函数,如`combinations()`, `permutations()`等,处理组合和排列问题。 - 应用动态规划、贪心算法、回溯法等算法思想,解决复杂问题。 4. **'leetcode2-master'项目**: - '...

    leetcode:LeetCode解决方案

    6. **回溯**:如“全排列”(Permutations),使用回溯算法找出所有可能的排列组合。 在阅读和学习这些解决方案时,你可以深入了解每种数据结构和算法的工作原理,并学习如何在 TypeScript 中有效地实现它们。同时...

Global site tag (gtag.js) - Google Analytics