首页 > 其他分享 >leetcode(力扣) 491. 递增子序列(回溯 & 去重思路)

leetcode(力扣) 491. 递增子序列(回溯 & 去重思路)

时间:2022-10-29 16:33:51浏览次数:66  
标签:repeat nums res backtrack len leetcode 力扣 path 491


文章目录

  • ​​题目描述​​
  • ​​思路分析​​
  • ​​完整代码​​

题目描述

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

示例 1:
输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

示例 2:
输入:nums = [4,4,3,2,1]
输出:[[4,4]]

思路分析

又是一道回溯题。
老规矩 三步走:

1.确定函数参数:
这个题的参数没什么变化,就还是那个startindex,前面说过无数遍了,就不说了。

2.确定终止条件:
这是这道题比较有意思的地方,终止条件可以理解为,收集结果的地方,实际上对于包括之前的子集问题,是没有终止条件的,就是任何子节点的结果都需要,而这道题唯一需要注意的两个地方就是,当前记录的答案里面是不是的元素是不是大于1个,而且是不是递增的。
是否递增可以去for循环里控制,这里只需要判断记录的答案里是不是元素是不是有2个及以上就行了。

if len(path) >=2:
res.append(path[:]) #注意这里不要加return,要取树上的节点

3.确定循环体:

因为这道题需要去重,而又不能用之前组合总和2里的那个去重思路,因为这是找子序列,不能排序,排序之后顺序就乱了。

两个去重思路,一个是收集答案的时候,看看答案里有没有重复的,没有的话再收集。这个思路比较简单。

另一个思路就是,建立一个数组repeat,记录本层树层使用过的元素,如果使用过就直接continue。

细节;

这里有一个需要注意的地方,就是去重数组repeat在哪里定义的问题,看下面的代码可以看到,我的答案集合res,和记录路径元素集合path都是在外面函数定义的,而reapeat是在回溯函数里定义的。

要知道repeat去重的是树层,也就是本层里重复的元素,纵向的重复是不记录的,关于这点,在之前的组合里有说过,这就不细说了,总之就是一个答案内的元素可以重复,多个答案之间不能相同。

而每一次向下一层走的时候都是一次递归,向下走一次(纵向)就是一个新的一层(横向),所以repeat = [] 定义在回溯,递归的函数里,每次向下走 就让他清空一次,记录新一层重复的值。

完整代码

思路1:
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res = []
path = []
def backtrack(startindex):
# 确定终止条件
if len(path) >=2:
if path[-1]>=path[-2] :
temp = path[:]
if temp not in res:
res.append(temp)
else:
return
for i in range(startindex,len(nums)):
path.append(nums[i])
backtrack(i+1)
path.pop()
backtrack(0)
return res

思路2:
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res = []
path = []
def backtrack(startindex):
# 确定终止条件
repeat = []
if len(path) >=2:
res.append(path[:])
for i in range(startindex,len(nums)):
if nums[i] in repeat:
continue
if len(path) >=1 and path[-1] > nums[i]:
continue
repeat.append(nums[i])
path.append(nums[i])
backtrack(i+1)
path.pop()
backtrack(0)
return res


标签:repeat,nums,res,backtrack,len,leetcode,力扣,path,491
From: https://blog.51cto.com/u_15849381/5806251

相关文章

  • Leetcode 90. 子集 II
    给你一个整数数组nums,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。返回的解集中,子集可以按任意顺序排列。示例1:输入:nums=[1......
  • Leetcode 915. 分割数组
    给定一个数组nums,将其划分为两个连续子数组left和right,使得:left中的每个元素都小于或等于right中的每个元素。left和right都是非空的。left的长度......
  • Leetcode 934. 最短的桥
    给你一个大小为nxn的二元矩阵grid,其中1表示陆地,0表示水域。岛是由四面相连的1形成的一个最大组,即不会与非组内的任何其他1相连。grid中恰好存在两座岛。你......
  • leetcode94-二叉树的中序遍历
    94.二叉树的中序遍历迭代法,看别人的代码的,还需要琢磨一下/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;......
  • LeetCode 1248. Count Number of Nice Subarrays
    原题链接在这里:https://leetcode.com/problems/count-number-of-nice-subarrays/题目:Givenanarrayofintegers nums andaninteger k.Acontinuoussubarrayis......
  • 力扣575(java&python)-分糖果(简单)
    题目:Alice有n枚糖,其中第i枚糖的类型为candyType[i]。Alice注意到她的体重正在增长,所以前去拜访了一位医生。医生建议Alice要少摄入糖分,只吃掉她所有糖的n/2......
  • 力扣1773(java&python)-统计匹配检索规则的物品数量(简单)
    题目:给你一个数组items,其中 items[i]=[typei,colori,namei],描述第i件物品的类型、颜色以及名称。另给你一条由两个字符串 ruleKey和ruleValue表示的检索规......
  • 代码随想录day29 | 491. 递增子序列 46. 全排列 47. 全排列 II
    491.递增子序列题目|文章思路这个题中不能对这个序列进行重新排序,因此需要用到set进行去重实现点击查看代码classSolution{public:vector<vector<int>>f......
  • leetcode145-二叉树的后序遍历
    145.二叉树的后序遍历classSolution{public:vector<int>res;voidTracking(TreeNode*root){if(root==nullptr)return;Tracking......
  • #yyds干货盘点# LeetCode 腾讯精选练习 50 题:螺旋矩阵
    题目:给你一个m行n列的矩阵 matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:输入......