Permutations Permutations||

地址:https://oj.leetcode.com/problems/permutations/

https://oj.leetcode.com/problems/permutations-ii/

题目简单说就是实现全排列。为了实现这个要求首先进行一下观察。

用123来示例下。123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来得231和312。因此可以知道——全排列就是从第一个数字起每个数分别与它后面的数字交换。

题目Permutations||要求能处理有重复元素的全排列。观察对122,第一个数1与第二个数2交换得到212,然后考虑第一个数1与第三个数2交换,此时由于第三个数等于第二个数,所以第一个数不再与第三个数交换。再考虑212,它的第二个数与第三个数交换可以得到解决221。此时全排列生成完毕。全排列中去掉重复的规则——去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。

下面是Permutations||代码,其实Permutations|| 代码直接改掉那个方法名称提交肯定可以通过。因为Permutations||是考虑了重复元素,而Permutations不需要考虑有重复元素出现。

public class Solution {
    	public List<List<Integer>> permuteUnique(int[] num) {
		List<List<Integer>> ans = new ArrayList<List<Integer>>();
		AllRange(num, 0, num.length-1, ans);
		return ans;
	}
	public void AllRange(int[]num,int start,int end,List<List<Integer>> ans){
		// 某个全排列完成添加
		if(start == end){
			List<Integer> temp = new ArrayList<Integer>();
			for(int i=0;i<num.length;i++){
				temp.add(num[i]);
			}
			ans.add(temp);
		}
		// 分别与后面元素进行交换
		for(int i=start;i<=end;i++){
			if(IsSwap(num, start, i)){
				SwapTwoNum(num, start, i);
				AllRange(num, start+1, end, ans);
				SwapTwoNum(num, start, i);
			}
		}
	}
	public void SwapTwoNum(int[]num,int x,int y){
		int temp = num[x];
		num[x] = num[y];
		num[y] = temp;
	}
	// 判断是否可以进行交换
	boolean IsSwap(int[]num,int start,int end){
		for(int i=start;i<end;i++){
			if(num[i]==num[end]){
				return false;
			}
		}
		return true;
	}
}

时间: 2024-10-04 04:20:41

Permutations Permutations||的相关文章

LeetCode46,47 Permutations, Permutations II

题目: LeetCode46 I Given a collection of distinct numbers, return all possible permutations. (Medium) For example,[1,2,3] have the following permutations: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] LeetCode47 II Given a collection of numb

[Leetcode]Permutations &amp;&amp; Permutations II

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]. 组合的题目,第一题无重复,第二题有重复. 自我感觉最常规的方法就是回溯法,两道题都试用.第一道没有重复的情况下还可以有更取巧的办法,第二题貌似只能

[C++]LeetCode: 120 Permutations II

题目: Given a collection of numbers that might contain duplicates, return all possible unique permutations. For example, [1,1,2] have the following unique permutations: [1,1,2], [1,2,1], and [2,1,1]. 思路:这道题和Permutations的区别就是,输入的数字数组中包含重复的元素.如果我们对重复的元素不

Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations. For example,[1,1,2] have the following unique permutations: [ [1,1,2], [1,2,1], [2,1,1] ] 分析: 全组合的思想,保证start和end之间交换的时候中间没有与end相同的数字 class Solution

LeetCode_45permute [Permutations]

#pragma warning(disable:4996) #include <cstdio> #include <tchar.h> #include <Windows.h> #include <vector> using namespace std; /* submit time : 1 request : Given a collection of numbers, return all possible permutations. For exampl

HDOJ 5338 ZZX and Permutations 线段树+树状数组

[题意]: 给一个排列加上表示循环的括号,问如何让1到n的对应的字典序最大. 从1开始贪心每个数字可以往三个地方走,右边第一个,跳转到左边的某一个,和自己构成循环 对于走到右边第一个的情况,只要判断右边的那个有没有被占据就可以了,如果可以和右边的互换,那么需要在线段树中将右边的数置为0 跳转到左边的某一个,一个数如果跳转到左边的某一个则说明左边的那个是括号开头这个数是括号结尾,用一个线段树查询区间里的最大值,由于括号间是不能重叠的,所以需要用树状数组二分一下左边界.如果这个数是要跳转到左边的某个

[LeetCode] Permutations

Well, have you solved the nextPermutation problem? If so, your code can be used in this problem. The idea is fairly simple: sort nums in ascending order, add it to res; generate the next permutation of nums using nextPermutation(), and add it to res;

[LintCode] Permutations

http://www.lintcode.com/en/problem/permutations/# Given a list of numbers, return all possible permutations. Example For nums = [1,2,3], the permutations are: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] class Solution { public: /** * @pa

UVA 11077 Find the Permutations DP

Find the Permutations Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem D Find the Permutations Input: Standard Input Output: Standard Output Sorting is one of the most used operations in real lif