首先要清楚,函数调用实际上是个进栈出栈的过程,调用结束之后其实是分级返回的。用下面一个简单的python3小程序来证明:

def Print(n):print('The location is : ' + str(n))if n < 4:Print(n+1)print('The location is : ' + str(n))if __name__ == "__main__":Print(1)

于是返回看LeetCode 491这题,代码如下:

class Solution:def findSubsequences(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""res = []self.dfs(nums, 0, res, [])print(res)def dfs(self, nums, index, res, path):if len(path) >= 2 and path not in res:res.append(path.copy())for i in range(index, len(nums)):if not path or path[-1] <= nums[i]:path += [nums[i]]self.dfs(nums, i + 1, res, path)path.pop()if __name__ == "__main__":Result = Solution()Result.findSubsequences(nums=[4, 6, 7, 7])

这里模仿dsf算法十分巧妙。
在单步模式下你会发现。
递归到range(index,len[nums]),假设输入 nums=[4,6,7,7]
range(4,4)时递归就结束了,这个时候开始返回。
递归执行时各层参数:
i-index = 0, path = [4]
i- index = 1 , path =[4,6]
i-index = 2, path = [4,6,7]
i-index = 3, path = [4,6,7,7]
这个时候 index=i+1=4执行, range(4,4)
开始回退,执行path.pop
i-index = 3, path = [4,6,7] 这个时候条件符合,执行循环,可是循环一开始range(3,4) i=3,在for循环时 i+1=4循环无法执行。故再次回退
i-index = 2, path = [4,6] 循环执行 再for循环和index处分别执行,最后i=4, path=[4,6,7]回退 执行pop 这边回退的话是到这次循环的上一级
程序不能运行的上一级i=3 index=i+1时,故为
i=3 index=2 path[4,6]
此时执行循环 i=4 回退。
i=index=1 path[4]接下去继续执行同理。

整个过程非常巧妙的符合深度优先算法,很有趣,不懂得可以看看,不过这种解法,时间复杂度太高。

对LeetCode491 dsf的解析。相关推荐

  1. java配置dsf,基于Spring-DM实现分布式服务框架(DSF)(二)

    在上篇分析完了在V 0.7需要干的活后,开始细化其中的实现细节,由于技术细节和之前想的有点不同,在细化的同时也稍做了调整,系统的架构仍然保持不变,在这篇blog中来看看实现每项任务的技术细节,之后就可 ...

  2. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  3. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  4. 条形码?二维码?生成、解析都在这里!

    二维码生成与解析 一.生成二维码 二.解析二维码 三.生成一维码 四.全部的代码 五.pom依赖 直接上代码: 一.生成二维码 public class demo {private static fi ...

  5. Go 学习笔记(82)— Go 第三方库之 viper(解析配置文件、热更新配置文件)

    1. viper 特点 viper 是一个完整的 Go应用程序的配置解决方案,它被设计为在应用程序中工作,并能处理所有类型的配置需求和格式.支持特性功能如下: 设置默认值 读取 JSON.TOML.Y ...

  6. Go 学习笔记(77)— Go 第三方库之 cronexpr(解析 crontab 表达式,定时任务)

    cronexpr 支持的比 Linux 自身的 crontab 更详细,可以精确到秒级别. ​ 1. 实现方式 cronexpr 表达式从前到后的顺序如下所示: 字段类型 是否为必须字段 允许的值 允 ...

  7. mybatis配置文件解析

    mybatis配置文件解析 mybatis核心配置文件`mybatis-config.xml文件. mybatis的配置文件包含了会深深影响mybatis行为的设置和属性信息. 能配置的内容: con ...

  8. 谷歌BERT预训练源码解析(二):模型构建

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39470744/arti ...

  9. Python 标准库之 xml.etree.ElementTree xml解析

    Python 标准库之 xml.etree.ElementTree Python中有多种xml处理API,常用的有xml.dom.*模块.xml.sax.*模块.xml.parser.expat模块和 ...

最新文章

  1. POJ 1118 求平面上最多x点共线
  2. pytorch实现L2和L1正则化regularization的方法
  3. nssl1299-选做作业【最大流,最小割,最大子权闭合图】
  4. qt中生成含有中文的json文件,读取含有中文的json文件
  5. CentOS上 安装NodeJS
  6. python中用于循环结构的关键字_详解Python的循环结构知识点
  7. Strut2页面传参跳转 --Struts2
  8. 如何激活windows的远程终端
  9. 原来PC界面临洗牌的背后原因是因为存储
  10. 利用模态DIV结合UpdateProgress防止页面重复提交
  11. integer是值传递还是引用传递_188W+程序员都关注的问题:Java到底是值传递还是引用传递?
  12. NYOJ--289--苹果
  13. paip.python ide eric5-5.3.7 安装以及建立项目使用 最佳实践
  14. LaTeX 符号命令大全
  15. python Django项目汇总(毕设、课设、学习)
  16. 本周AI热点回顾:Hinton独立发布44页论文火爆社区;新特效火爆全网!各路神仙齐唱《蚂蚁呀嘿》...
  17. 开源开放 | 一个用于文言文实体识别与关系抽取等任务的开源数据集C-CLUE(CCKS2021)...
  18. Android 7.0 Vold工作流程
  19. Android如何获得Root权限来卸载程序?
  20. 最新IP数据库-基于国家省份城市县区和运营商-专业准确-每月发行

热门文章

  1. 使用MySQL Workbench 导入数据ERROR: Import data file: 'ascii' codec can't decode byte 0xc3 in position...
  2. iPhone 4的4.3.1完美越狱教程
  3. 长安大学计算机专业考研科目,长安大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  4. 你了解c++中的关键字virtual吗?
  5. php重签ipa,免电脑iOS无限自动重签IPA工具ReProvision教学
  6. moviepy音视频开发:使用volumex调节音量大小及其花式用法
  7. Ylmf 出Linux了!!!!
  8. openwrt ppoe拨号后数据为零的解决方法
  9. win10安装一键ghost,重启仍然直接进入win10的解决办法
  10. 网页审查元素css乱码,CSDN网页打印乱码重叠解决办法