Preview:

1. Implement strStr()

O(m*n):

  1. class Solution
  2. {
  3. public:
  4. int strStr(string haystack,string needle)
  5. {
  6. for(int i=;i<=int(haystack.size()-needle.size());i++)
  7. {
  8. int j;
  9. for(j=;j<needle.size();j++)
  10. {
  11. if(haystack[i+j]!=needle[j])
  12. break;
  13. }
  14. if(j==needle.size())
  15. return i;
  16. }
  17. return -;
  18. }
  19. };

注意:size()函数返回值是size_t类型,是unsigned的,所以假如有可能为负数的话就会出问题。haystack.size()是有可能小于needle.size()的,有可能为负,因此要加个int强制转换。

或者,如果不想强制转换的话,可以把外层for循环的判断改为 i + needle.size() <= haystack.size(); 这样就不会涉及到负数了。

O(m+n):

ref: soul

2.  Subsets

  1. class Solution
  2. {
  3. public:
  4. vector<vector<int>> subsets(vector<int> &nums)
  5. {
  6. sort(nums.begin(),nums.end());
  7. dfs(nums,);
  8. return result;
  9. }
  10. vector<vector<int>> result;
  11. vector<int> path;
  12. void dfs(vector<int> &nums,int start)
  13. {
  14. result.push_back(path);
  15. for(int i=start;i<nums.size();i++)
  16. {
  17. path.push_back(nums[i]);
  18. dfs(nums,i+);
  19. path.pop_back();
  20. }
  21. }
  22. };

对于排序后为{0,1,4}的序列,result输出是这样的:

  1. :
  2. : ,
  3. : , ,
  4. : , , ,
  5. : , ,
  6. : ,
  7. : , ,
  8. : ,

仔细思考一下顺序为什么是这样的。

3. Subsets II

  1. class Solution
  2. {
  3. public:
  4. vector<vector<int>> subsetsWithDup(vector<int> &nums)
  5. {
  6. sort(nums.begin(),nums.end());
  7. dfs(nums,);
  8. return result;
  9. }
  10. vector<vector<int>> result;
  11. vector<int> path;
  12. void dfs(vector<int> &nums, int start)
  13. {
  14. result.push_back(path);
  15. for(int i=start;i<nums.size();i++)
  16. {
  17. if(i>start && nums[i]==nums[i-]) continue;
  18. path.push_back(nums[i]);
  19. dfs(nums,i+);
  20. path.pop_back();
  21. }
  22. }
  23. };

参考自己当时的分析。对于一个特定的for循环,它所循环到的每个元素都是针对当前同一个位置的不同元素的替换(它们之前的前缀都是一样的)。

注意判重是基于i>start的基础上,start之前那是前缀的事,不用管,只要保证从start之后在同一个位置不会出现重复元素就行。

比如nums是[1,2,2,2,2,2,2,3],前缀是[1,2,2],那么只要保证之后不会出现重复的[1,2,2,2]之类的就行了。

4. Permutations

  1. class Solution
  2. {
  3. public:
  4. vector<vector<int>> permute(vector<int> &nums)
  5. {
  6. dfs(nums);
  7. return result;
  8. }
  9. vector<vector<int>> result;
  10. vector<int> path;
  11. void dfs(vector<int> &nums)
  12. {
  13. if(path.size()==nums.size())
  14. {
  15. result.push_back(path);
  16. return;
  17. }
  18. for(int i=;i<nums.size();i++)
  19. {
  20. if(find(path.begin(),path.end(),nums[i])==path.end())
  21. {
  22. path.push_back(nums[i]);
  23. dfs(nums);
  24. path.pop_back();
  25. }
  26. }
  27. }
  28. };

5. Permutations II

  1. class Solution
  2. {
  3. public:
  4. vector<vector<int>> permuteUnique(vector<int> &nums)
  5. {
  6. for(auto x:nums)
  7. umap[x]++;
  8. dfs(nums);
  9. return result;
  10. }
  11. vector<vector<int>> result;
  12. vector<int> path;
  13. unordered_map<int,int> umap;
  14. void dfs(vector<int> &nums)
  15. {
  16. if(path.size()==nums.size())
  17. {
  18. result.push_back(path);
  19. return;
  20. }
  21. for(auto p=umap.begin();p!=umap.end();p++)
  22. {
  23. if(p->second>)
  24. {
  25. path.push_back(p->first);
  26. umap[p->first]--;
  27. dfs(nums);
  28. umap[p->first]++;
  29. path.pop_back();
  30. }
  31. }
  32. }
  33. };

如果nums里之前是已经排好序的元素,那么如果把result输出来其实可以看到,所有的permutation是按照从小到大的顺序。

其实把元素放进unordered_map中就隐含着把元素按照相同元素在一起的顺序放了,隐含着排了个序。对排序的元素来处理可以避免重复取值。ref

[NCH03]

递归如何求复杂度?

全排列如何求时间复杂度?首先看总共有多少种情况,是n!个。然后在递归的时候递归内部的处理的复杂度是O(n)。所以全排列的时间复杂度是n * n!

二叉树如何求时间复杂度?大部分是O(n),n为点的个数。

二叉树的空间复杂度?空间复杂度主要耗费栈空间。栈空间主要和h相关。

[NCH 1, 3]的更多相关文章

  1. 同步降压DC-DC转换IC——XC9264

    设计一个12V转3.3V,输出电流30mA的电源电路,由于项目对转化效率要求较高,所以不能采用低压差线性稳压LDO的方案.经过对比,TOREX的XC9264效率在此转化条件下效率可做到85%以上,比M ...

  2. 用bootstrap实现多张图片手动轮回

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABBoAAAJoCAIAAABHhBX4AAAgAElEQVR4nOzdZXdcV7rg8fmIM2vm3r

  3. BOOST.Asio——Tutorial

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  啥说的,鄙视那些无视版权随 ...

  4. 【Windows编程】系列第四篇:使用Unicode编程

    上一篇我们学习了Windows编程的文本及字体输出,在以上几篇的实例中也出现了一些带有“TEXT”的Windows宏定义,有朋友留言想了解一些ANSI和Unicode编程方面的内容,本章就来了解和学习 ...

  5. 伸展树Splay

    新学的,其实吧,就那么回事.... 看了几天,splay处理序列问题,真的非常厉害,翻转,插入,删除,线段树实现不了的功能,splay用起来很方便. POJ 3580 SuperMemo 这题基本就是 ...

  6. JMeter学习-024-JMeter 命令行(非GUI)模式详解(二)-执行代理设置

    闲话少述,接 上文 继续... 5.设置代理 jmeter -n -t JMeter分布式测试示例.jmx -H 20.9.215.90 -P 9999 -l report\01-result.csv ...

  7. 为现有图像处理程序添加读写exif的功能

    为现有图像处理程序添加读取exif的功能 exif是图片的重要参数,在使用过程中很关键的一点是exif的数据能够和图片一起存在.exif的相关功能在操作系统中就集成了,在csharp中也似乎有了实现. ...

  8. OAF_开发系列07_实现OAF下拉菜单的上下联动Poplist Synchor(案例)

    20150706 Created By BaoXinjian

  9. 浅谈Winform事件的实现以及模拟其事件的实现(附实现源码)

    当我们初学Winform的时候被其神奇的事件功能所吸引,当点击一个按钮时,便会跳到我们所写的点击方法当中去.然而这并不符合我们对方法的理解,究竟.net在后面帮助我们实现了什么.我们怎样模拟其事件的实 ...

随机推荐

  1. Asp.NET MVC 拍卖网站,拆解【1】预览与目录

    本人最近带创业团队基本做完了一个艺术品拍卖的外包项目,分为网站前台(asp.net mvc5),网站管理员管理的后台使用的9900端口(asp.net mvc5),监听拍卖状态的windows服务,为 ...

  2. (转)zabbix之生产案例

    原文: https://www.abcdocker.com/abcdocker/category/zabbix/ 原文: https://chegva.com/1170.html

  3. 命令行下 初识 redis 入门教程

    1. redis-cli 命令行进入redis set,get, setex,给键值设置过期时间 setex name 10 DOG //设置name键 为 DOG 10秒后过期. setnx,判断值 ...

  4. SpringBoot集成WebSocket【基于STOMP协议】进行点对点[一对一]和广播[一对多]实时推送

    原文详细地址,有点对点,还有广播的推送:https://blog.csdn.net/ouyzc/article/details/79884688 下面是自己处理的一些小bug 参考原文demo,结合工 ...

  5. ELK系列~Fluentd对大日志的处理过程~16K

    Fluentd是一个日志收集工具,有输入端和输出端的概念,前者主要是日志的来源,你可以走多种来源方式,http,forward,tcp都可以,后者输出端主要指把日志进行持久化的过程,你可以直接把它持久 ...

  6. 标准差(bias) 方差(variance)

    偏差(bias) 偏差度量了学习算法的期望预测与真实结果的偏离程序, 即 刻画了学习算法本身的拟合能力 . 方差(variance) 方差度量了同样大小的训练集的变动所导致的学习性能的变化, 即 刻画 ...

  7. [转]MAC:删除终端默认前缀的计算机名

    MAC:删除终端默认前缀的计算机名 1.打开终端 输入 sudo vi /etc/bashrc,提示输入密码就是计算机的密码. 2.点击i将编辑模式改成insert修改文档,使用#注释PS1=’\h: ...

  8. php方法重载

    php方法重载   <?php/* * php面向对象的重写与重载重写:就是当子类继承父类的一些方法后,子类又在其内部定义了相同的方法,则这个新定义的方法会覆盖继承而来的父类的方法,子类只能调用 ...

  9. JS数组和函数 小记

    数组 JS中的数组来自window,是一个全局的对象,typeof的值是'object'. 创建数组: 1.Array(3):当只传一个值的时候,会生成一个长度为该数值的空数组. 2.Array(3, ...

  10. 百度开源e-chart初探

    前言: 近年来,在数据服务的公司中,数据可视化越来越重要.随着而来的,国内外正在如火如荼的开发各种在线js视图展示框架.而百度的e-chart算是实用性较高且体验最好的!今天闲来无事,便来玩玩~ ec ...