回溯三步
Choose
Explore
UnChoose

return条件
stack.size() == nums.length

一.对于求全排列类型问题

需要一个visited数组标记该位置元素是否被使用过
dfs方法需要for…loop,并判断visited[i]==true 就跳过此次循环

(1)不考虑去重(LeetCode46)

不需要对Arrays.sort(nums)
LeetCode46,47,78,90回溯总结(全排列与子集)

(2)考虑去重(LeetCode47)

需要对Arrays.sort(nums)
dfs中判断
if(i > 0 && nums[i] == nums[i - 1] && visited[i - 1] == false)
LeetCode46,47,78,90回溯总结(全排列与子集)

二.对于求子集类型问题

不需要visited数组,不需要for循环
需要调用两次dfs(Choose与UnChoose各一次)

(1)不考虑去重(LeetCode78)

LeetCode46,47,78,90回溯总结(全排列与子集)

(2)考虑去重(LeetCode90)

需要While判断
如果下一个数和当前数相同,跳到下一个数的位置
LeetCode46,47,78,90回溯总结(全排列与子集)

相关文章: