type none struct{} func findSubsequencesDP(nums []int) (ans [][]int) { dp := make([][]int, 0) set := make(map[string]none) for _, i := range nums { for _, a := range dp { if a[len(a)-1] <= i { arr := append(a, i) key := arr2str(arr) if _, ok := set[key]; !ok { dp = append(dp, arr) ans = append(ans, arr) set[key] = none{} } } } key := arr2str([]int{i}) if _, ok := set[key]; !ok { dp = append(dp, []int{i}) set[key] = none{} } } return } func arr2str(arr []int) string { var sb strings.Builder for _, i := range arr { sb.WriteString(strconv.Itoa(i)) sb.WriteRune(',') } return sb.String() } func findSubsequencesDFS(nums []int) (ans [][]int) { dfs(nums, len(nums), 0, make([]int, 0), &ans) return } func dfs(nums []int, n int, s int, cur []int, ans *[][]int) { set := make(map[int]bool) for i := s; i < n; i++ { if l := len(cur); l != 0 && nums[i] < cur[l-1] { continue } else if _, ok := set[nums[i]]; ok { continue } set[nums[i]] = true nxt := append(cur, nums[i]) if 2 <= len(nxt) { *ans = append(*ans, nxt) } dfs(nums, n, i+1, nxt, ans) } }