本题和子集||看起来是相似的,看起来可以用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();
}
}
}