Preview:

1. Implement strStr()

O(m*n):

 class Solution
{
public:
int strStr(string haystack,string needle)
{
for(int i=;i<=int(haystack.size()-needle.size());i++)
{
int j;
for(j=;j<needle.size();j++)
{
if(haystack[i+j]!=needle[j])
break;
}
if(j==needle.size())
return i;
}
return -;
}
};

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

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

O(m+n):

ref: soul

2.  Subsets

 class Solution
{
public:
vector<vector<int>> subsets(vector<int> &nums)
{
sort(nums.begin(),nums.end());
dfs(nums,);
return result;
}
vector<vector<int>> result;
vector<int> path;
void dfs(vector<int> &nums,int start)
{
result.push_back(path);
for(int i=start;i<nums.size();i++)
{
path.push_back(nums[i]);
dfs(nums,i+);
path.pop_back();
}
}
};

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

:
: ,
: , ,
: , , ,
: , ,
: ,
: , ,
: ,

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

3. Subsets II

 class Solution
{
public:
vector<vector<int>> subsetsWithDup(vector<int> &nums)
{
sort(nums.begin(),nums.end());
dfs(nums,);
return result;
}
vector<vector<int>> result;
vector<int> path;
void dfs(vector<int> &nums, int start)
{
result.push_back(path);
for(int i=start;i<nums.size();i++)
{
if(i>start && nums[i]==nums[i-]) continue;
path.push_back(nums[i]);
dfs(nums,i+);
path.pop_back();
}
}
};

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

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

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

4. Permutations

 class Solution
{
public:
vector<vector<int>> permute(vector<int> &nums)
{
dfs(nums);
return result;
}
vector<vector<int>> result;
vector<int> path;
void dfs(vector<int> &nums)
{
if(path.size()==nums.size())
{
result.push_back(path);
return;
}
for(int i=;i<nums.size();i++)
{
if(find(path.begin(),path.end(),nums[i])==path.end())
{
path.push_back(nums[i]);
dfs(nums);
path.pop_back();
}
}
}
};

5. Permutations II

 class Solution
{
public:
vector<vector<int>> permuteUnique(vector<int> &nums)
{
for(auto x:nums)
umap[x]++;
dfs(nums);
return result;
}
vector<vector<int>> result;
vector<int> path;
unordered_map<int,int> umap;
void dfs(vector<int> &nums)
{
if(path.size()==nums.size())
{
result.push_back(path);
return;
}
for(auto p=umap.begin();p!=umap.end();p++)
{
if(p->second>)
{
path.push_back(p->first);
umap[p->first]--;
dfs(nums);
umap[p->first]++;
path.pop_back();
}
}
}
};

如果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. 关于Java的权限修饰符(public,private,protected,默认friendly)

    以前对访问修饰符总是模棱两可,让自己仔细解释也是经常说不很清楚.这次要彻底的搞清楚. 现在总结如下: 一.概括总结 各个访问修饰符对不同包及其子类,非子类的访问权限 Java访问权限修饰符包含四个:p ...

  2. WCF系列教程之WCF服务宿主与WCF服务部署

    本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF ...

  3. linux MD5 SHA1 等 文件校验方法

    为解决官方发布的软件包被别人更改或者软件在传输过程中出现传输错误等问题,软件官方在提供软件包的同时,还提供一个保存MD5校验码的文件. Linux/unix中可以使用 md5sum 文件名 sha1s ...

  4. 【Maven学习】maven-enforcer-plugin的使用

    我们会经常碰到这样的问题,在pom中引入了一个jar,里面默认依赖了其他的jar包.jar包一多的时候,我们很难确认哪些jar是我们需要的,哪些jar是冲突的.此时会出现很多莫名其妙的问题,什么类找不 ...

  5. 第十篇---javascript函数this关键字

    <script type="text/javascript" charset="utf-8"> //this:this对象是指运行时期基于执行环境所 ...

  6. devise在引擎中安装后,设置访问自定义页面

    rails generate devise:views User Turn on scoped_views in config/initializer/devise.rb view config.sc ...

  7. Django获取Header中的信息

    今天需要从header中获取一些信息,查了一些资料,需要注意一下几点: request.META.get("header key") 用于获取header的信息 注意的是heade ...

  8. WPF 自定义ScrollViwer

    ScrollViewer自定义样式 ScrollViewer在各种列表.集合控件中广泛使用的基础组建,先看看效果图: 如上图,ScrollViewer简单来说分两部分,一个横向的滚动条,一个垂直滚动条 ...

  9. java1.8中ConcurrentHashMap

    java1.8中的ConcurrentHashMap做了非常大的改动,整个数据结构都发生了变化,已经不存在segment了.所以要好好重新查看下源码.这篇博客是逐步更行的,看一点写一点. 首先看一个很 ...

  10. oracle:ORA-00911: 无效字符 问题和解决---Eclipse中的SQL语句不能加分号

    eclipse中原sql: 异常: 原因:Eclipse中的SQL语句不能加分号 去掉分号,正常执行,插入成功. 这里把id设为了主键,具有唯一性,重复插入同一id执行插入失败,ORA-00001号错 ...