1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { private List<List<Integer>> ans;
public List<List<Integer>> findSubsequences(int[] nums) { ans = new ArrayList<>(); backtrack(new ArrayList<>(), nums, 0); return ans; }
private void backtrack(List<Integer> currComb, int[] nums, int ptr) { Set<Integer> used = new HashSet<>(); for (int i = ptr; i < nums.length; i++) { if (!used.contains(nums[i]) && (currComb.isEmpty() || nums[i] >= currComb.get(currComb.size() - 1))) { currComb.add(nums[i]); if (currComb.size() > 1) { ans.add(new ArrayList<>(currComb)); } backtrack(currComb, nums, i + 1); currComb.remove(currComb.size() - 1); used.add(nums[i]); } } } }
|
我们用一个list来装non-decreasing sequence.首先是sequence第0个元素, nums中从0到最后一个元素都可以做, 然后是找第1个元素, 第一个元素的候选数需要是第0个元素在nums中index之后. 然后是第2个元素…
这么看来就是backtrack的典型特征.在sequence的某个位置, 相同数字不能重复坐拥这个位置. 于是我们使用一个local set来去存储当前位置有哪些数字坐过, 坐过的之后就不能再做了. 一个函数栈桢就代表sequence中的一个位置, 因此local set就可以用来记录在sequence的当前位置上哪些数字在这里坐过.
时间复杂度和空间复杂度不会搞.