
本题和子集||看起来是相似的,看起来可以用boolean数组判断是否重复,但是实际上本题不能这么做,因为本题不是有序数组,而是要判断是否有序,因此需要换个思路。

做回溯类题最重要的是画图,画图难度少一大半,而且逻辑性很强
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> findSubsequences(int[] nums) {
if (nums == null || nums.length == 0) return res;
backtrack(nums, 0);
return res;
}
private void backtrack(int[] nums, int index) {
//只有path中装了2个以上数字的时候才有可能放进res
if (path.size() > 1) {
res.add(new ArrayList<>(path));
}
//used数组判断是否重复过,1表示之前有重复取到过
int[] used = new int[201];
for (int i = index; i < nums.length; i ++) {
//path不为空并且当前遍历的数字小于path中的最后一个数
//或者此时used数组中当前值之前使用过,那么跳过此轮循环
if ((!path.isEmpty() && nums[i] < path.get(path.size() - 1)) ||
(used[nums[i] + 100] == 1)) continue;
path.add(nums[i]);
//加入当前值之后需要在used数组记录当前位置曾经使用过
used[nums[i] + 100] = 1;
backtrack(nums, i + 1);
path.removeLast();
}
}
}

本文主要探讨了如何解决一个关于寻找数组中递增子序列的问题。作者通过使用回溯算法来解决这个问题,强调了在处理此类问题时画图的重要性。文章提供了Java代码实现,展示了如何维护一个路径列表和使用一个布尔数组避免重复,并在路径中元素数量大于1时将其添加到结果集中。
188

被折叠的 条评论
为什么被折叠?



