LeetCode. 전체 배열 (Java + backtracking)

반복되는 숫자가없는 시퀀스가 ​​주어지면 가능한 모든 순열을 반환합니다.
예 :
입력 : [1,2,3]
출력 : [[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1 , 2], [3,2,1]]

쓰기 : 4ms
는 혼자서 할 수 있습니다.

public class Permutations {
    
    
	List<List<Integer>> resList = new ArrayList<List<Integer>>();

	public List<List<Integer>> permute(int[] nums) {
    
    
		ArrayList<Integer> list = new ArrayList<>();
		HashSet<Integer> set = new HashSet<>();
		for (int i = 0; i < nums.length; i++) {
    
    
			set.add(nums[i]);
			list.add(nums[i]);
			dfs(nums, list, set, i);
			set.remove(nums[i]);
			list.remove(list.size() - 1);
		}
		return resList;

	}

	public void dfs(int[] nums, List<Integer> list, HashSet<Integer> set, int index) {
    
    
		if (list.size() == nums.length) {
    
    
			resList.add(new ArrayList<>(list));
			return;
		}
		if (index >= nums.length || list.size() > nums.length) {
    
    
			return;
		} else {
    
    
			for (int i = 0; i < nums.length; i++) {
    
    
				if (i == index) {
    
    
					continue;
				}
				if (!set.contains(nums[i])) {
    
    
					set.add(nums[i]);
					list.add(nums[i]);
					dfs(nums, list, set, i);
					set.remove(nums[i]);
					list.remove(list.size() - 1);
				}
			}
		}

	}
}

쓰기 방법 2 : 쓰기 방법 1의 개선 된 버전입니다. 2ms
는 불필요한 코드를 많이 제거하고 통합했습니다.
1. 특별한 상황을 고려하여 : 배열의 길이가 0이면 빈 목록이 반환
됩니다 2. 배열 요소의 가중치를 추가하고 처리를 위해 dfs에 추가하고 index로 표시된 아래 첨자를 제거합니다.
코드는 좀 더 간결합니다.

public class Permutations2 {
    
    
	List<List<Integer>> resList = new ArrayList<List<Integer>>();

	public List<List<Integer>> permute(int[] nums) {
    
    
		if (nums.length == 0) {
    
    
			return new ArrayList<>();
		}
		dfs(nums, new ArrayList<>(), new HashSet<>());
		return resList;

	}

	public void dfs(int[] nums, List<Integer> list, HashSet<Integer> set) {
    
    
		if (list.size() == nums.length) {
    
    
			resList.add(new ArrayList<>(list));
			return;
		} else {
    
    
			for (int i = 0; i < nums.length; i++) {
    
    
				if (!set.contains(nums[i])) {
    
    
					set.add(nums[i]);
					list.add(nums[i]);
					dfs(nums, list, set);
					set.remove(nums[i]);
					list.remove(list.size() - 1);
				}
			}
		}

	}
}

종료.

추천

출처blog.csdn.net/weixin_44998686/article/details/109023836