解题思路
题目要求子序列至少2个元素且递增,那么我们添加条件可以是当path中有两个元素的时候
使用哈希表记录当前层使用过的元素,若再次碰到直接continue
当nums[i] < path的最后一个元素时则continue
代码
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution: def findSubsequences(self, nums: List[int]) -> List[List[int]]: result = [] def backtracking(startIndex: int, path: list[int]) -> None: if len(path) >= 2: result.append(path.copy()) uset = set() for i in range(startIndex, len(nums)): if path and nums[i] < path[-1]: continue if nums[i] in uset: continue path.append(nums[i]) uset.add(nums[i]) backtracking(i + 1, path) path.pop()
backtracking(0, []) return result
|
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { private: vector<vector<int>> result; vector<int>path;
void backtracking(int startIndex, vector<int> &nums) { unordered_set<int> uset;
if (path.size() > 1) result.push_back(path);
for (int i = startIndex; i < nums.size(); ++i) { if (!path.empty() && nums[i] < path[path.size() - 1]) continue; if (uset.find(nums[i]) != uset.end()) continue; uset.insert(nums[i]); path.push_back(nums[i]); backtracking(i + 1, nums); path.pop_back(); } }
public: vector<vector<int>> findSubsequences(vector<int>& nums) { result.clear(); path.clear(); backtracking(0, nums); return result; }
};
|
Go
var result [][]int
var path []int
func findSubsequences(nums []int) [][]int {
result = [][]int{}
path = []int{}
backtracking(0, nums)
return result
}
func backtracking(startIndex int, nums []int) {
if len(path) > 1 {
t := make([]int, len(path))
copy(t, path)
result = append(result, t)
}
uset := make(map[int]bool)
for i := startIndex; i < len(nums); i++ {
if len(path) != 0 && nums[i] < path[len(path) - 1] {continue}
if uset[nums[i]] == true {continue}
path = append(path, nums[i])
uset[nums[i]] = true
backtracking(i + 1, nums)
path = path[:len(path) - 1]
}
}