全排列 01

64 阅读1分钟

LeetCode 46

原题链接

代码如下:

class Solution {
    List<List<Integer>> res = new ArrayList<List<Integer>>();
	
	public void swap(int[] nums, int i, int j ) {	//交换函数
		int temp = nums[i];
		nums[i] = nums[j];
		nums[j] = temp;
	}
	//全排列
	public void permutation(int[] nums, int left, int right) {
		if(left == right) {
			List<Integer> list = new ArrayList<Integer>();	//帮助集合,用于存储结果集合中的子元素
			for(int i = 0; i < nums.length; i++) {
				list.add(nums[i]);					//将符合条件的子数组,全部元素存入帮助集合中
			}
			res.add(list);							//将帮助集合中的元素添加到结果集合中,充当子元素
		}
		
		for(int i = left; i <= right; i++) {		//滑动指针向右靠拢
			swap(nums, left, i);					//滑动指针与左边界交换,相当于让后面的元素都作一次左边界
			permutation(nums, left + 1, right);		//选出左边界,然后让后面的子数组重复以上步骤
			swap(nums, left, i);					//操作完后,要重新交换回来,不能对原数组进行改动,影响递归操作
		}
	}
	
    public List<List<Integer>> permute(int[] nums) {
    	if(nums.length == 0) {
    		List<Integer> list = new ArrayList<Integer>();
    		res.add(list);
    		return res;								//返回一个空的“二维”集合
    	}
    	
    	permutation(nums, 0, nums.length - 1);
    	
    	return res;
    }
}