给定一个整数数组nums,返回给定数组中至少有两个元素的所有不同的可能的非递减子序列。你可以按任何顺序返回答案。
1 <= nums.length <= 15
100 <= nums[i] <= 100
利用dfs遍历,根据题中数据量的限制,数组的长度最大时15,所以也就是子序列最大长度是15,我们可以用一个长度为15的数组来做map的key。发现相同序列,跳过,不同的记录到答案。
注意这个数组要初始化,不能做0,0是可以作为输入元素的。
func Solution(nums []int) [][]int {
ans := make([][]int, 0)
l := len(nums)
visited := make(map[[15]int]struct{})
var dfs func(int, [15]int, int, map[[15]int]struct{})
dfs = func(start int, path [15]int, idx int, visited map[[15]int]struct{}) {
if start >= l {
return
}
for next := start + 1; next < l; next++ {
if nums[next] < nums[start] {
continue
}
path[idx] = nums[next]
if _, ok := visited[path]; ok {
continue
}
visited[path] = struct{}{}
dst := make([]int, idx+1)
copy(dst, path[:idx+1])
ans = append(ans, dst)
dfs(next, path, idx+1, visited)
}
}
for i := 0; i < l-1; i++ {
path := [15]int{nums[i], -101, -101, -101, -101, -101, -101, -101, -101, -101, -101, -101, -101, -101, -101}
dfs(i, path, 1, visited)
}
return ans
}