LeetCode 递增子序列(回溯法)

给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。

示例:

输入: [4, 6, 7, 7]
输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]

说明:

给定数组的长度不会超过15。
数组中的整数范围是 [-100,100]。
给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。

思路分析: 因为需要查找所有可能的序列,所以需要用深搜、广搜这种算法。有一个需要注意的点就是处理重复的问题,我们可以使用set容器元素唯一性进行去重。

class Solution {
public:
	vector<vector<int>> findSubsequences(vector<int>& nums) {
		int numsSize = nums.size();
		vector<int> tempRes;//中间结果
		set<vector<int>> result;//先将所有结果保存在set中,方便去重
		myDFS(result, nums, tempRes, -100, 0);//开始搜索
		return vector<vector<int>>(result.begin(), result.end());
	}
    //lastNum是上一次放入tempRes中的元素(第一次初始化为-100),beginIndex是当前访问的下标
	void myDFS(set<vector<int>> &result, vector<int>& nums, vector<int>& tempRes, int lastNum, int beginIndex) {
		int numsSize = nums.size();
        //搜索到了尾端
		if (beginIndex == numsSize) {
			if (tempRes.size() > 1) {//判断这个结果是否符合要求
				result.insert(tempRes);//插入到集合中
			}
		}
		else {
            //跳过这个元素
			myDFS(result, nums, tempRes, lastNum, beginIndex + 1);
            //或者当这个元素符合放入条件(递增)
			if (lastNum <= nums[beginIndex]) {
				tempRes.push_back(nums[beginIndex]);
				myDFS(result, nums, tempRes, nums[beginIndex], beginIndex + 1);
				tempRes.pop_back();
			}
		}
		return;
	}
};

在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页