<<算法很美>>——(四)——深入递归<二>——“逐步生成结果“类问题之非数值型

简介: <<算法很美>>——(四)——深入递归<二>——“逐步生成结果“类问题之非数值型

合法括号


image.png

思路:首先我们要找出规律,然后写出递归式。这个题通过画图我们会得到Sn={对Sn-1中每个元素进行添左,添右,添包,左和右肯定会重复,我们可以用STL标准库中的set进行去重.

image.png

递归

#include<iostream>
#include<set>
using namespace std;
set<string> generateParenthesis(int n) {
    set<string> s_n;
    if (n == 1)
    {
        s_n.insert("()");
        return s_n;
    }
    set<string> s_n_1 = generateParenthesis(n - 1);
    for (string eofn_1 : s_n_1)
    {
        s_n.insert("()" + eofn_1);
        s_n.insert(eofn_1 + "()");
        s_n.insert("(" + eofn_1 + ")");
    }
    return s_n;
}
int main()
{
    set<string> generateParenthesis1 = generateParenthesis(4);
    for (set<string>::iterator it = generateParenthesis1.begin(); it != generateParenthesis1.end(); it++)
     {
         cout << *it << " ";
     }
    return 0;
}

迭代

set<string> generateParenthesis2(int n) {
    set<string> res;
    res.insert("()");
    if (n == 1)
    {
        return res;
    }
    for (int i = 2; i <= n; i++)
    {
        set<string> res_new;
        for (string e : res)
        {
            res_new.insert(e + "()");
            res_new.insert("()" + e);
            res_new.insert("(" + e + ")");
        }
        res = res_new;
    }
    return res;
}

牛刀小试

括号生成

所有子集


image.png

思路:


如果集合中共有 n 个元素,那么确定集合的子集共需要 n 步。每一步都需要从集合中取出一个元素,这时候存在两个选择,添加当前数字或者不添加。生成一个子集需要若干步,并且每一步都有若干种选择,这是应用回溯法的典型问题。


代码中 helper 函数共有四个参数,第一个参数是原数组 nums,第二个参数是当前需要选择的数字在 nums 数组内的下标 index,第三个参数是当前子集 cur,第四个参数是当前已经生成的子集的集合 ret。


对于 nums 数组内的下标 index 的数字,当前有两种选择。第一种是不考虑加入,那么可以直接跳过,调用递归函数判断 index + 1 的情况。第二种是考虑加入,那么将该数字加入当前子集 cur 中,接着调用递归函数判断 index + 1 的情况,递归函数执行完之后,还需要将加入的数字删除,这样才能使当前子集 cur 在进入当前递归函数之后和执行完当前递归函数之后的值保持不变。


递归

class Solution {
private:
    void helper(vector<int>& nums, int index, vector<vector<int>>& ret, vector<int>& cur) {
        if (index == nums.size()) {
            ret.emplace_back(cur);
            return;
        }
        // 不加入第 index 个数字
        helper(nums, index + 1, ret, cur);
        // 加入第 index 个数字
        cur.push_back(nums[index]);
        helper(nums, index + 1, ret, cur);
        cur.pop_back();
    }
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ret;
        vector<int> cur;
        helper(nums, 0, ret, cur);
        return ret;
    }
};


相关文章
|
1月前
|
算法
基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
本设计基于龙格库塔算法对锅炉单相受热管进行建模与MATLAB数值仿真,简化为喷水减温器和末级过热器组合,考虑均匀传热及静态烟气处理。使用MATLAB2022A版本运行,展示自编与内置四阶龙格库塔法的精度对比及误差分析。模型涉及热传递和流体动力学原理,适用于优化锅炉效率。
|
3月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
81 2
|
4月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
88 4
|
4月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
81 1
|
4月前
|
算法 定位技术
数据结构与算法学习九:学习递归。递归的经典实例:打印问题、阶乘问题、递归-迷宫问题、八皇后问题
本文详细介绍了递归的概念、重要规则、形式,并展示了递归在解决打印问题、阶乘问题、迷宫问题和八皇后问题等经典实例中的应用。
72 0
|
6月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
67 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
6月前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
6月前
|
数据采集 算法 数据可视化
基于K-Means聚类算法对球员数据的聚类分析,可以自主寻找最优聚类数进行聚类
本文介绍了一个基于K-Means聚类算法的NBA球员数据分析项目,该项目通过采集和分析球员的得分、篮板、助攻等统计数据,使用轮廓系数法和拐点法确定最优聚类数,将球员分为不同群组,并提供了一个可视化界面以便直观比较不同群组的球员表现。
126 0
基于K-Means聚类算法对球员数据的聚类分析,可以自主寻找最优聚类数进行聚类
|
7月前
创建KNN类
【7月更文挑战第22天】创建KNN类。
52 8
|
7月前
|
算法 数据库

热门文章

最新文章