99. Permutations

Given a collection of distinct 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].

分析:

采用从nums[0..i-1]递推出nums[0..i]的排列 个数变成了原来的(i+1)倍. 比如,之前nums中的元素是[1,2,3],进行排列的时候我们可以先得到前两个的为[1,2]和[2,1]. 当再加入元素3的时候,针对[1,2]这个排列3有三个空可以插进去变成[3,1,2],[1,3,2]和[1,2,3]. 对[2,1]同理可变成[3,2,1],[2,3,1]和[2,1,3].

/**
	 * 采用从nums[0..i-1]递推出nums[0..i]的排列 个数变成了原来的(i+1)倍.
	 * 比如,之前nums中的元素是[1,2,3],进行排列的时候我们可以先得到前两个的为[1,2]和[2,1].
	 * 当再加入元素3的时候,针对[1,2]这个排列3有三个空可以插进去变成[3,1,2],[1,3,2]和[1,2,3].
	 * 对[2,1]同理可变成[3,2,1],[2,3,1]和[2,1,3]
	 */
	public List<List<Integer>> permute(int[] nums) {
		List<List<Integer>> list = new ArrayList();
		List<List<Integer>> tempList = new ArrayList();//临时存储的元素
		int len = nums.length;
		if(len<=0){
			return list;
		}
		/*初始化list中只有一个元素的情况*/
		ArrayList<Integer> list1 = new ArrayList<Integer>();//表示外层list的一个元素
		list1.add(nums[0]);
		list.add(list1);
		/*进入循环从nums[0..i-1]递推出nums[0..i]的排列*/
		for(int i=1;i<len;i++){
			int size = list.size();//i-1的时候排列的集合个数,相当于nums = [1,2,3],只排列了前两个时得到的[[1,2][2,1]]的长度
			for(int j=0;j<size;j++){
				list1 = (ArrayList<Integer>) list.get(j);//取出i-1的一个集合,相当于取出[[1,2][2,1]]中的[1,2]
				int size1 = list1.size();
				for(int k=0;k<=size1;k++){//找nums[i]可以插进去的位置
					ArrayList<Integer> list2 = new ArrayList<Integer>();
					list2.addAll(list1.subList(0, k));
					list2.add(nums[i]);
					list2.addAll(list1.subList(k, size1));
					tempList.add(list2);
				}
			}
			/*list首先把之前的元素都清空,然后全部装上最新的元素*/
			list.clear();
			list.addAll(tempList);
			tempList.clear();
		}
		return list;
    }

你可能感兴趣的:(99. Permutations)