递归算法学习——子集

这篇具有很好参考价值的文章主要介绍了递归算法学习——子集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

递归算法学习——子集,算法学习——递归,算法,学习,数据结构,c++,leetcode,深度优先,学习笔记

 

目录

一,题目解析

二,例子

三,题目接口

 四,解题思路以及代码

1.完全深度搜索

2.广度搜索加上深度优先搜索

五,相似题

1.题目

2.题目接口

 3.解题代码


一,题目解析

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

二,例子

递归算法学习——子集,算法学习——递归,算法,学习,数据结构,c++,leetcode,深度优先,学习笔记

如以上例子,其实这道题里的子集的概念其实就是我们在高中时学习到的子集。一个含有n个数字的集合一共就有2^n个子集。空集是任何集合的子集。

三,题目接口

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {

    }
};

 四,解题思路以及代码

1.完全深度搜索

首先,我们可以来模拟一下这个集合完全通过深度优先搜索算法挑选子集的过程。先来说一说步骤,以数组{1,2,3}为例:

1.首先,我们得来做选择,在遍历到1时有两种选择,选和不选。通过这两种选择会导致两种不同的结果,也就是两种不同的集合。

2.到了第二层,遍历到了2这个数字。也会有两种不同的选择,又在上面一层的基础之上又会有四种不同的结果。

3.在最后一层遍历到3时,3的选与不选在上面两层的基础之上又会生成八种不同的结果。这8种结果便是我们要的所有子集。

画成图像如下:

递归算法学习——子集,算法学习——递归,算法,学习,数据结构,c++,leetcode,深度优先,学习笔记

按照这个思路写出的代码如下:

class Solution {
public:
    vector<int> path;
    vector<vector<int>>ret;

    vector<vector<int>> subsets(vector<int>& nums) {
        dfs(nums,0);
        return ret;
    }

    void dfs(vector<int>& nums,int pos)
    {
        if(pos == nums.size())
        {
            ret.push_back(path);
            return;
        }

        //在这一层选空节点
        dfs(nums,pos+1);

        //选对应的数字
        path.push_back(nums[pos]);
        dfs(nums,pos+1);
        path.pop_back();//递归完一层以后要还原现场,也就是回溯
    }
};

2.广度搜索加上深度优先搜索

其实完全走深度优先搜索的方法其实效率不是很高,所以为了提高效率便可以将广度优先搜索算法给加入进来。以[1,2,3]为例,用这个算法的步骤如下:

1.首先,一言不合便开始将path加入到ret中,那在第一次假如时便将空集给加入到ret中了。

2.将这一层中的元素加入到path中,然后再往下递归。

3.再次插入元素到path,再插入到ret中。再往下递归。递归结束的时候下标的值是等于数组的元素个数的。在递归完了以后也要回溯恢复现场。

图解过程如下:

递归算法学习——子集,算法学习——递归,算法,学习,数据结构,c++,leetcode,深度优先,学习笔记

代码如下:

class Solution {
public:
    vector<int> path;
    vector<vector<int>>ret;

    vector<vector<int>> subsets(vector<int>& nums) {
        dfs(nums,0);
        return ret;
    }

    void dfs(vector<int>& nums,int pos)
    {
       ret.push_back(path);//一言不合便将path塞入到ret中

       for(int i = pos;i<nums.size();i++)//其实这里边相当于一个递归的结束条件
       {
          path.push_back(nums[i]);
          dfs(nums,i+1);//递归下一层
          path.pop_back();//回溯,恢复现场
       }  
    }
};

五,相似题

1.题目

一个数组的 异或总和 定义为数组中所有元素按位 XOR 的结果;如果数组为  ,则异或总和为 0 。

  • 例如,数组 [2,5,6] 的 异或总和 为 2 XOR 5 XOR 6 = 1 。

给你一个数组 nums ,请你求出 nums 中每个 子集 的 异或总和 ,计算并返回这些值相加之  。

注意:在本题中,元素 相同 的不同子集应 多次 计数。

数组 a 是数组 b 的一个 子集 的前提条件是:从 b 删除几个(也可能不删除)元素能够得到 a 。

2.题目接口

class Solution {
public:
    int subsetXORSum(vector<int>& nums) {

    }
};

 3.解题代码

其实这道题和子集这道题的代码可太像了,所以不多赘述,代码如下:文章来源地址https://www.toymoban.com/news/detail-683067.html

class Solution {
public:
    int sum;
    int path;
    int subsetXORSum(vector<int>& nums) {
        dfs(nums,0);
        return sum;
    }

    void dfs(vector<int>&nums,int pos)
    {
        sum+=path;

        for(int i = pos;i<nums.size();i++)
        {
            path = path^nums[i];
            dfs(nums,i+1);
            path = path^nums[i];//消消乐定律,这一层的自己和自己异或便是恢复上一层样子。
        }
    }
};

到了这里,关于递归算法学习——子集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 递归算法学习——子集

      目录 一,题目解析 二,例子 三,题目接口  四,解题思路以及代码 1.完全深度搜索 2.广度搜索加上深度优先搜索 五,相似题 1.题目 2.题目接口  3.解题代码 给你一个整数数组  nums  ,数组中的元素  互不相同  。返回该数组所有可能的子集(幂集)。 解集  不能  包含

    2024年02月10日
    浏览(35)
  • 数据结构与算法(小议递归)

    递归是一种常用的算法设计,递归就是一种循环推理。简单来说就是调用原算法本身的算法。 这里主要探讨递归的使用, 用一个简单的例子来看: 这是一个很流行的裴波那契数列计算函数,很多编程书籍喜欢拿这个数列做例子。当然一般不会这么写~ 这函数看上去很优雅,

    2024年02月01日
    浏览(51)
  • 算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)

    1. 插入排序(insertion-sort):                                           是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入     算法稳定性:                  

    2024年02月09日
    浏览(53)
  • 算法与数据结构——递归算法+回溯算法——八皇后问题

    八皇后问题是一个经典的回溯算法问题,目的是在8×8的国际象棋棋盘上放置八个皇后,使得没有皇后可以互相攻击(即没有两个皇后在同一行、同一列或同一对角线上)。 回溯算法是一种解决问题的算法,它通过尝试所有可能的解决方案来解决问题。在八皇后问题中,计算

    2024年02月09日
    浏览(52)
  • 【算法】递归解决各种数据结构的遍历问题

    对于递归算法,我们最先想到的应该就是用递归的方式去中序遍历一棵树,递归的使用使得我们可以先深入到下层中,然后慢慢的输出下层的元素之后输出上层元素。 因此,基于此,我们甚至可以使用递归来逆序输出一个栈,链表等数据结构。 使用递归输出树 使用递归逆序

    2024年02月08日
    浏览(65)
  • 【数据结构】二叉树的遍历递归算法详解

    我们来写一个函数 BuyNode(x)函数 用于创建二叉树结点。 用动态开辟函数 malloc 函数进行动态开辟,并强制转换为 BTNode 型,用变量 node 来去管理开辟的空间。 我们初始化结点,其 val 即为传入的参数x,左右指针 left 和 right 都设为NULL。 我们在主函数中创建上面这样一颗二叉树

    2024年01月20日
    浏览(43)
  • 【数据结构与算法】单链表的排序算法(选择,冒泡,递归)

    目录 选择排序 冒泡排序 快速排序 合并两条链表并排序 选择排序 链表的选择排序思想与数组的排序类似,但是链表需要先找到里面最小或者最大的值,然后将这个值用改链语句进行操作 我们先看这个改链语句的操作(min是笔者打错了应该是max,但是图已经画好了就没有改)

    2024年02月04日
    浏览(55)
  • 【数据结构与算法】:非递归实现快速排序、归并排序

    🔥 个人主页 : Quitecoder 🔥 专栏 :数据结构与算法 上篇文章我们详细讲解了递归版本的快速排序,本篇我们来探究非递归实现快速排序和归并排序 快速排序的非递归实现主要依赖于栈(stack)来模拟递归过程中的函数调用栈。递归版本的快速排序通过递归调用自身来处理子

    2024年03月24日
    浏览(52)
  • 【数据结构与算法】归并排序详解:归并排序算法,归并排序非递归实现

    归并排序是一种经典的排序算法,它使用了分治法的思想。下面是归并排序的算法思想: 递归地将数组划分成较小的子数组,直到每个子数组的长度为1或者0。 将相邻的子数组合并,形成更大的已排序的数组,直到最终得到一个完全排序的数组。 归并排序的过程可以分为三

    2024年01月22日
    浏览(66)
  • 【数据结构与算法】快速排序的非递归实现方法

      目录 一.前言 二.非递归实现 如果数据量过大的话,不断递归就会出现 栈溢出 的现象,这个时候你的代码是没问题的,但就是跑不起来,这个时候就要 把递归改成非递归 。 一般有两种改法: 1.直接改,利用循环等; 2.借助栈的辅助。 而快速排序的非递归实现方法就需要

    2023年04月17日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包