题意

给定一个整数数组nums,返回给定数组中至少有两个元素的所有不同的可能的非递减子序列。你可以按任何顺序返回答案。

思路

利用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
}