这篇page是针对leetcode上的491.递增子序列所写的。小尼先简单的说明一下这道题的意思,首先就是给出一个整数数组nums,找出并且返回所有改数组中不同的递增子序列,要求是子序列中至少有两个元素。
小尼先跟大家简单的分析一下这道题,其实这道题的思路并不复杂,首先给出的数组是有顺序的,然后给出的数组只需要写出递增的数组。小倪先拉一下代码:
class Solution {
private List<Integer> path = new ArrayList<>();
private List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> findSubsequences(int[] nums) {
backtracking(nums,0);
return res;
}
private void backtracking (int[] nums, int start) {
if (path.size() > 1) {
res.add(new ArrayList<>(path));
}
int[] used = new int[201];
for (int i = start; i < nums.length; i++) {
if (!path.isEmpty() && nums[i] < path.get(path.size() - 1) ||
(used[nums[i] + 100] == 1)) continue;
used[nums[i] + 100] = 1;
path.add(nums[i]);
backtracking(nums, i + 1);
path.remove(path.size() - 1);
}
}
}
小尼对上面的代码做一下解释,首先就是我们int了一个used数组,然后我们写了这一句判断:
if (!path.isEmpty() && nums[i] < path.get(path.size() - 1) || (used[nums[i] + 100] == 1)) continue;
也就是说如果此时数组中的元素的值不为空,并且此时的值如果小于我们加入了path里面的此时最后一数的值,那么我们直接跳过这一层循环,直接进入下一层循环,然后们标记此时的used中对应的数值为1,小尼在这里简单的说明一下used数组的作用,起始就是我们的每一个元素座位开头字母使用的时候我们都只能使用一次,所以我们这里写了一个额外的数组以便来进行比较我们的开头的数组是否重复,当我们遇到了重复的元素我们就直接跳过。
希望小伙伴可以得到帮助