Leetcode回溯
回溯问题的模版在78.子集里面展现的淋漓尽致:
答案视角:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| private void dfs(int i) { ans.add(new ArrayList<>(path)); if (i == nums.length) return; for (int j = i; j < nums.length; ++j) { path.add(nums[j]); dfs(j + 1); path.remove(path.size() - 1); } }
|
选择视角
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private void dfs(int i) { if (i == nums.length) { ans.add(new ArrayList<>(path)); return; } dfs(i + 1); path.add(nums[i]); dfs(i + 1); path.remove(path.size() - 1); }
|
在多数情况下,是答案视角符合的问题更多一些
在排列问题中,比如46.全排列和47.全排列2中,需要添加一个辅助数组onpath
来标记一下某些数字是否被选
通过如下代码可以避免重复问题:
1 2 3 4
| while (j < nums.length - 1 && nums[j] == nums[j + 1]&&onPath[j]==false) { ++j; }
|