感觉像之前那样一题记录一次,太浪费网络资源了,所以后面的我都会做成合集,一个合集大概20题的样子,代码只放在github上面这里只记录题意和解法.这样应该可以节约不少网络资源了吧…
Merge Sorted Array
- 题意:给长度为m数组1和长度为n的数组2,都是有序的,要求合成一个数组而且是有序的。(数组1的长度大于等于n+m)
- 解法:倒着过来存比较好处理,枚举数组1的值x,把数组2大于等于x的值加到数组1的后面,然后再把x加到后面。
- Code
Same Tree
- 题意:给两棵二叉数,判断是不是完全一样的.
- 解法:暴力即可,递归下去看节点如果都为空返回
true
,一个为空,返回false
,值不相等,返回false
,左右再递归 - Code
Symmetric Tree
- 题意:给一棵二叉树,看是不是轴对称的
- 解法:首先如果给的树为空,返回
true
.否则就左右同时递归下去看值是否相等.PS:一开始我居然愚蠢地用了先序和后序遍历看是不是全部值相等,发现结论并不对,跪在了{1,2,3,3,#,2}.后来改了同时递归才ac.鶸. - Code
Binary Tree Level Order Traversal
- 题意:给一棵二叉树,把同一级的放在一块,然后整体返回.
- 解法:中序递归下去,加个参数表示层级,然后在这层级
push_back
这个值即可。 - Code
Maximum Depth of Binary Tree
- 题意:给一棵二叉树, 求深度.
- 解法:递归下去,如果参数为空,返回0,否则是std::max(左子树深度,右子树深度)+1.最后返回的结果就是最大深度.
- Code
Binary Tree Level Order Traversal II
Balanced Binary Tree
- 题意:判断一棵二叉树,是不是平衡二叉树
- 解法: 对于每个节点,把左右子树的最大深度求出来,看差的绝对值是不是小于2,如果某个节点不满足,就是不平衡的.
- Code
Path Sum
- 题意: 给一棵二叉树,总是否存在一条路径(从根节点到叶子节点)的和是给定的值sum
- 解法:坑,叶子节点必须得左右子树都为空跪了几发才反应过来。解法就是直接dfs下去,走一个节点就把sum减去节点的值,最后遇到叶子节点的时候判断一下sum是不是0.
- Code
Pascal’s Triangle
- 题意: 求杨辉三角
- 解法:双重循环暴力,可以当是简单递推,递推方程式为 dpi,j=dpi−1,j+dpi−1,j−1 ,杨辉三角的定义便是如此
- Code
Pascal’s Triangle II
- 题意: 杨辉三角#2版,这次只需要返回第k行就可以了,不过题目限制了只能用 O(k) 的空间复杂度.
- 解法: 这题考的是杨辉三角的性质,杨辉三角的第k行,从左到右可以看着是组合数
Cik,0≤i≤k
,注意这里k行有k+1个,也就是说从第0行开始数的,因为组合数是对称的,所以只需要求一半即可(左右赋值),对于第i个组合数有
Cik=∏k−ij=kj∏ij=1j
,这里可以用双重循环求得分子和分母,不过这肯定不太好,时间太浪费,因为我们是从左到右开始求的,所以,第i个的分子可以是前一个分子乘
k−i
,分母是前一个分母乘以
i
,所以可以在
O(1) 的时间算出来分子分母.注意在过程中可以求一下gcd约分。 - Code
Valid Palindrome
- 题意: 给一串字符,去掉其中的非字母和非数字同时不管大小写,看是不是回文串.
- 解法:暴力,定义两个变量l,r,表示左边和右边的目标值,在比较s[l]和s[r]之前,循环去掉非比较对象的字符, 比较的时候要无视大小写,所以判断
s[l-'A']%32==s[r-'A']%32
即可(32是由于’A’到’a’之间的差为32. - Code
Min Stack
- 题意:实现栈,并且快速找到最小值。
- 解法:栈的实现就有
std::stack<int>
即可,快速找到最小值的方法是再维护一个单调递减的栈minStack
,这样就要吧在 O(1) 的时间内得到最小值了,维护的时候就在push
普通栈的时候看是不是小于等于minStack.top()
,如果是就加入栈,在pop
的时候看是不是等于minStack.top()
如果是,就minStack
也要pop
一下. - Code
Compare Version Numbers
- 题意:比较两个版本大小.
- 解法:就暴力去找两个串的每个值拿出来比较,找的时候为了通用,可以写个函数来取值省去判断两个串长短,像下面这样
int getIntInVersion(const string& kVersion, int& iStartPos) {
int iResult = 0, i;
for (i = iStartPos; i < (int)kVersion.size() && isdigit(kVersion[i]); ++i) {
iResult = (iResult << 1) + (iResult << 3) + kVersion[i] - '0';
}
return iStartPos = i + 1, iResult;
}
Excel Sheet Column Title
- 题意: Excel表的行表示.
- 解法: 在很久很久之前大一暑假集训的时候写过这个,当时用了很复杂的组合数学什么的..现在想看来当时好蠢
2333,这题就是把一个整数换成26进制,值为’A’~’Z’,十进制换26进制的方法跟二进制差不多,一直往下除直到为0,不过这里比较特殊,因为是1到26,不是0到25,所以除的时候要减1再除. - Code
Majority Element
- 题意: 给n个数,其中有个数出现的次数超过了一半,请找出这数.
- 解法:最简单直接的方法就是排个序,然后把中间那个数返回,复杂度为 O(nlogn) ,不过这种方法的话,顺序就乱了,网上有种 O(n) 的方法而且不用打乱顺序,大概是说计数,开始计数为0,循环的时候如果计数为0,则result为当前值(如果为0,前面的数说明最坏的情况是有两个数分别出现了k次那么前面的都不会是答案,这个才有可能是答案,下一个值如果和result不等,计数减一,相等加一..
- Code
Excel Sheet Column Number
Factorial Trailing Zeroes
- 题意:求n的阶乘,末尾有几个0。
- 解法:说来尴尬,多年前就遇到过这个问题,不知道怎么解,只知道有个公式,一直除五。现在,依然不会,还是要去网上搜
阶乘末尾的0
,才能看懂。 - Code
Rotate Array
- 题意:反转一个数组,把前面m个数,拿到后面去.
- 解法:这题去年被枭哥问过..我虽然当时也是想了个 O(n) 的算法,不过实现后看起来相对比较麻烦,一个比较优秀的方法是先反转前面m个数,再反转后面n-m个数,最后集体再反转一次。复杂度也是 O(n) 。代码看起来就机智多了,orz…
- Code