leetcode-46-全排列(permutations)-java

版权声明:此文章为许诗宇所写,如需转载,请写下转载文章的地址 https://blog.csdn.net/xushiyu1996818/article/details/84525920

题目及测试

package pid046;

import java.util.List;

/*全排列

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

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


*/
public class main {
	
	public static void main(String[] args) {
		int[] testTable=new int[]{1,2,3,4};
		test(testTable);
		
		
	}
		 
	private static void test(int[] ito) {
		Solution solution = new Solution();
		int length=ito.length;
		List<List<Integer>> rtn;
		for(int i=0;i<length;i++){
			System.out.print( ito[i]+"  ");			
		}
		System.out.println();
		long begin = System.currentTimeMillis();
		rtn=solution.permute(ito);//执行程序
		long end = System.currentTimeMillis();		
		
		for(int i=0;i<rtn.size();i++){			
			for(int j=0;j<rtn.get(i).size();j++){
				System.out.print( rtn.get(i).get(j)+"  ");
			}
			System.out.println();
		}
		
		System.out.println();
		System.out.println("耗时:" + (end - begin) + "ms");
		System.out.println("-------------------");
	}

}

解法1(成功,8ms,较慢)

在类中建立一个result的变量,放置结果
建立permutateRemain函数,变量为上一次的全排列几位的list(now)和还能排的数字的list(remain)
在函数中,
如果remain剩余的量为0,将now加入result
对remain进行遍历,在遍历中
遍历的数字为now
先建立一个对now的copy newlist,将newlist加入now
然后将remain除去now,进行新的permutateRemain,然后在remain重新加入now,结束遍历

package pid046;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

public class Solution {
	List<List<Integer>> result=new ArrayList<>();
	
	public List<List<Integer>> permute(int[] nums) {
		int length=nums.length;
		if(length==0){
			return result;
		}
	    List<Integer> now=new ArrayList<>();
	    List<Integer> remain=new ArrayList<>(nums.length);
	    for(int num:nums){
	    	remain.add(num);
	    }
		permuteRemain(now,remain);		
		return result;
	}
	
	public void permuteRemain(List<Integer> now,List<Integer> remain){
		if(remain.size()==0){
			result.add(now);
			return;
		}
		List<Integer> newList;
		for(int i=0;i<remain.size();i++){
			Integer num=remain.get(i);
			remain.remove(i);
			newList=new ArrayList<>();
			newList.addAll(now);
			newList.add(num);
			permuteRemain(newList, remain);
			remain.add(i, num);
		}
		
	}
	
}

解法2(别人的)

省去了不断copy list的时间,加了判断now有无这个num的时间

package go.jacob.day819;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
/**
 * 46. Permutations
 * @author Jacob
 * 题意:求数组的全排列
 */
public class Demo1 {
	List<List<Integer>> res;
 
	public List<List<Integer>> permute(int[] nums) {
		res = new ArrayList<List<Integer>>();
		if (nums == null || nums.length < 1)
			return res;
		//对数组元素进行从小到大排序
		Arrays.sort(nums);
		ArrayList<Integer> list = new ArrayList<Integer>();
 
		solve(list, nums);
 
		return res;
	}
 
	private void solve(ArrayList<Integer> list, int[] nums) {
		if (list.size() == nums.length) {
			res.add(new ArrayList<Integer>(list));
			return;
		}
		for (int i = 0; i < nums.length; i++) {
			if (!list.contains(nums[i])) {
				list.add(nums[i]);
				solve(list, nums);
				list.remove(list.size() - 1);
			}
		}
	}
}

解法3,解法4

字典序 的非递归全排列

递归的交换全排列

http://www.cnblogs.com/pmars/archive/2013/12/04/3458289.html

https://segmentfault.com/a/1190000007067885

猜你喜欢

转载自blog.csdn.net/xushiyu1996818/article/details/84525920