您的位置:首页 > 其它

[LeetCode]Easy合集I

2015-12-27 18:39 323 查看
感觉像之前那样一题记录一次,太浪费网络资源了,所以后面的我都会做成合集,一个合集大概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

题意: 和上面这题差不多,就是顺序深度颠倒过来.

解法: 上面的代码,后面加个reverse()就好了.

Code

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;
}


Code

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

题意:和前面那题刚好相反,这题要求给出ABCD表示的列,算出是第几列。

这个更简单,就是求一下把26进制转换成整数,注意是从1开始.

Code

Factorial Trailing Zeroes

题意:求n的阶乘,末尾有几个0。

解法:说来尴尬,多年前就遇到过这个问题,不知道怎么解,只知道有个公式,一直除五。现在,依然不会,还是要去网上搜
阶乘末尾的0
,才能看懂。

Code

Rotate Array

题意:反转一个数组,把前面m个数,拿到后面去.

解法:这题去年被枭哥问过..我虽然当时也是想了个O(n)的算法,不过实现后看起来相对比较麻烦,一个比较优秀的方法是先反转前面m个数,再反转后面n-m个数,最后集体再反转一次。复杂度也是O(n)。代码看起来就机智多了,orz…

Code

Reverse Bits

题意:给一个无符号整n,要求把二进制反转返回。

解法:前面有一个十进制反转的,这个就差不多一样了,前面那个一直除10,这个一直除2就是了.PS:食用位运算,味道更佳.

Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode