update 0491.递增子序列:修改错字,优化 go 代码

This commit is contained in:
Yuhao Ju
2022-12-09 17:43:10 +08:00
committed by GitHub
parent 26e8174687
commit f132a28dba

View File

@ -37,7 +37,7 @@
在[90.子集II](https://programmercarl.com/0090.子集II.html)中我们是通过排序,再加一个标记数组来达到去重的目的。 在[90.子集II](https://programmercarl.com/0090.子集II.html)中我们是通过排序,再加一个标记数组来达到去重的目的。
而本题求自增子序列,是不能对原数组行排序的,排完序的数组都是自增子序列了。 而本题求自增子序列,是不能对原数组行排序的,排完序的数组都是自增子序列了。
**所以不能使用之前的去重逻辑!** **所以不能使用之前的去重逻辑!**
@ -78,7 +78,7 @@ if (path.size() > 1) {
* 单层搜索逻辑 * 单层搜索逻辑
![491. 递增子序列1](https://img-blog.csdnimg.cn/20201124200229824.png) ![491. 递增子序列1](https://img-blog.csdnimg.cn/20201124200229824.png)
在图中可以看出,**同一父节点下的同层上使用过的元素就不能使用了** 在图中可以看出,**同一父节点下的同层上使用过的元素就不能使用了**
那么单层搜索代码如下: 那么单层搜索代码如下:
@ -340,30 +340,33 @@ class Solution:
``` ```
### Go ### Go
```golang ```go
var (
res [][]int
path []int
)
func findSubsequences(nums []int) [][]int { func findSubsequences(nums []int) [][]int {
var subRes []int res, path = make([][]int, 0), make([]int, 0, len(nums))
var res [][]int dfs(nums, 0)
backTring(0,nums,subRes,&res)
return res return res
} }
func backTring(startIndex int,nums,subRes []int,res *[][]int){ func dfs(nums []int, start int) {
if len(subRes)>1{ if len(path) >= 2 {
tmp:=make([]int,len(subRes)) tmp := make([]int, len(path))
copy(tmp,subRes) copy(tmp, path)
*res=append(*res,tmp) res = append(res, tmp)
} }
history:=[201]int{}//记录本层元素使用记录 used := make(map[int]bool, len(nums)) // 初始化used字典用以对同层元素去重
for i:=startIndex;i<len(nums);i++{ for i := start; i < len(nums); i++ {
//分两种情况判断:一,当前取的元素小于子集的最后一个元素,则继续寻找下一个适合的元素 if used[nums[i]] { // 去重
// 或者二,当前取的元素在本层已经出现过了,所以跳过该元素,继续寻找
if len(subRes)>0&&nums[i]<subRes[len(subRes)-1]||history[nums[i] + 100]==1{
continue continue
} }
history[nums[i] + 100]=1//表示本层该元素使用过了 if len(path) == 0 || nums[i] >= path[len(path)-1] {
subRes=append(subRes,nums[i]) path = append(path, nums[i])
backTring(i+1,nums,subRes,res) used[nums[i]] = true
subRes=subRes[:len(subRes)-1] dfs(nums, i+1)
path = path[:len(path)-1]
}
} }
} }
``` ```