LeetCode解题思路(3)

屌丝程序猿的LeetCode刷题记【第三季——第101~143题】:

1.写给自己看的,同时希望能给大家一点帮助。

2.自己做不出来的题目借鉴了各路大神的思路。

3.很多题目做法都比较屌丝,但思路比较易懂(自己比较容易记得住),大神勿喷。

--------------------------------
[2013-11-02]Reorder List

用了一种特别无耻的做法……先把所有节点以索引为key保存在map里,然后从两头往中间取,做指针修改,竟然过了!(后来看到网上的大神说可以先把后半个list翻转然后合并前半个list和后半个list。)

[2013-10-30]Linked List Cycle II

先利用下题算法判断是否有环。若有环,则用一个HashSet来记录扫过的节点引用。(这纯粹是偷懒的耍流氓式做法,crack the code interview上有正解。)

[2013-10-28]Linked List Cycle

设两个指针p和q,p每次前移一步,q每次前移两步。这样,若有环,则p、q必在某个时刻相遇,若无环,则一定是q先变成null。

[2013-10-05]Word Break II

利用二维数组记录s的每个子串是否在dict中,然后递归深搜。时间复杂度:O(n^2)。

[2013-10-04]Word Break

利用二维数组记录s的每个子串是否可以分割为dict中的词。时间复杂度:O(n^2)。

[2013-10-03]Copy List With Random Pointer

利用一个map建立原链表中的每个节点和新建链表中对应节点的映射关系。时间复杂度:O(n)。

[2013-10-02]Single Number II

利用长度为32的int数组记录每个二进制位在数组中为1的个数,取出模3不为0的位,置1即得。时间复杂度:O(n)。

[2013-10-01]Single Number

异或。时间复杂度:O(n)。

[2013-09-30]Candy

从左向右、从右向左各扫一遍,不满足要求的就把rating较大者设为较小者+1。时间复杂度:O(n)。

[2013-09-28]Gas Station

先算出代表供需差的数组,利用p、q两指针维护一个窗口,窗口内的值非负则q前移,若为负则p前移直至非负,若窗口能覆盖一圈则表示可以(窗口大小可以用一个计数变量count来记录),若p扫到数组右端则表示不行。时间复杂度:O(n)。

[2013-09-24]Clone Graph

类似于Copy List With Random Pointer,利用一个map记录新老节点的映射关系,首先广搜遍历原图并拷贝图节点,然后遍历map的keySet,设置每个新节点的neighbors。时间复杂度:O(n+e)。

[2013-02-28]Palindrome Partitioning II

利用二维数组记录s的每个子串是否回文,然后一维动态规划:a[i]表示s[0..i]的最小切割数,根据a[0]..a[i-1]求a[i]时尝试在每个索引处进行切割。时间复杂度:O(n^2)。

[2013-02-27]Palindrome Partitioning

利用二维数组记录s的每个子串是否回文,然后递归深搜。时间复杂度:O(n^2)。

[2013-02-21]Surrounded Regions

将矩阵先扩张一层(变成(n+2)x(n+2)),然后从左上角开始做填充:利用队列保存最近填充的单元,从队列中取出单元后先填充四邻域然后四邻域入队。时间复杂度:O(n^2)。

[2013-02-18]Sum Root to Leaf Numbers

递归地走到每个叶节点,逐层×10然后传递到下一层,到叶节点即把相应的值加到全局计数变量中。时间复杂度:O(n)。

[2013-02-13]Longest Consecutive Sequence

先把数组元素保存到HashSet中(为了保证“判断元素是否在数组中”操作可在常数时间内完成),然后遍历原数组,若元素在Set中则向增、减两个方向分别扩张查找,注意找过的元素需要在Set中删除。时间复杂度:O(n)。

[2013-02-10]Word Ladder II

至今没过……

[2013-02-10]Word Ladder

用一个包含HashSet的列表,保存每一步能到达的单词(挨个位置试,每个位置只需要判断25次),每确定一个单词就将其从dict中删除,直到找到end。时间复杂度:O(mn)。(n:dict长度,m:每个单词的长度)

[2013-01-12]Valid Palindrome

从两头往中间扫,忽略非字母。时间复杂度:O(n)。

[2012-11-07]Binary Tree Maximum Path Sum

后序递归遍历,对于每个节点,返回以其为一个端点的路径最大值,同时在以下几种情况中寻找全局最大值:(1)根节点;(2)根节点+左子树返回值;(3)根节点+右子树返回值;(4)根节点+左子树返回值+右子树返回值。递归函数的返回值在前三种情况中取。时间复杂度:O(n)。

[2012-11-06]Best Time to Buy and Sell Stock III

一维动态规划:用两个数组分别保存在限制一次交易的情况下,在每个时间点之前卖出和在每个时间点之后买入能获得的最大收益。(需要两个辅助变量记录数组前缀最小值和后缀最大值。)时间复杂度:O(n)。

[2012-10-30]Best Time to Buy and Sell Stock II

取所有的非降序序列的上升值之和。(这么简单的题自己竟然没想到!)时间复杂度:O(n)。

[2012-10-30]Best Time to Buy and Sell Stock

III中已包含此问题的解法。时间复杂度:O(n)。

[2012-10-29]Triangle

二维动态规划:记录顶端到每个点的最大值路径,用两个列表交替往下走,可以做到空间复杂度O(n)。时间复杂度:O(n^2)。

[2012-10-28]Pascal's Triangle II

杨辉三角。用两个列表,一个保存结果,另一个暂存上一行的结果。时间复杂度:O(n^2)。

[2012-10-28]Pascal's Triangle

杨辉三角。时间复杂度:O(n^2)。

[2012-10-28]Populating Next Right Pointers in Each Node II

先序递归调用连接函数,由于不保证是满二叉树,所以需要先递归处理右子树,然后处理左子树,这样可以保证每层的节点在向右找next的时候总能找到正确结果。

[2012-10-28]Populating Next Right Pointers in Each Node

与II类似,不过由于是满二叉树,所以可以按照先左子树后右子树的顺序遍历处理。

[2012-10-18]Distinct Subsequences

二维动态规划:m[i][j]表示S[i..]和T[j..]的结果。若S[i]==T[j],则可以选择S[i]与T[j]匹配,或者S[i]与T[j]不匹配,即m[i][j]=m[i+1][j+1]+m[i+1][j],若两者不等,则只能是S[i+1..]去与T[j..]匹配,即m[i][j]=m[i+1][j]。时间复杂度:O(mn)。

[2012-10-14]Flatten Binary Tree to Linked List

先序递归处理左子树和右子树,然后将原左子树设成右子树,然后左子树置0,最后找到新的右子树(原左子树)的右端点,然后把原右子树接上去。

[2012-10-14]Path Sum II

递归向下找,保存路径上的和,找到叶节点若相等则加入输出列表。(因为没说节点上有没有负值所以不能走到中间就停。)

[2012-10-13]Path Sum

递归向下找,目标值减去节点值传到下一层。

[2012-10-09]Minimum Depth of Binary Tree

求根节点到叶节点的最短路径。递归。

[2012-10-08]Balanced Binary Tree

递归检查:递归函数返回子树是否是平衡二叉树并计算出该子树的高度,一颗二叉树是平衡二叉树的充要条件是左右子树都是平衡的且左右子树高度差不超过1。

[2012-10-02]Convert Sorted List to Binary Search Tree

把链表转成数组来做,或者在O(n)时间内找到链表正中间节点,从该节点左侧切断链表然后左右分别递归处理。后者时间复杂度:O(nlogn)。

[2012-10-02]Convert Sorted Array to Binary Search Tree

二分水题。时间复杂度:O(n)。

[2012-09-30]Construct Binary Tree from Inorder and Postorder Traversal

递归建树,注意控制好左右端点。(由于没有重复元素所以比较简单。)时间复杂度:O(n)。

[2012-09-30]Construct Binary Tree from Preorder and Inorder Traversal

同上

[2012-09-29]Maximum Depth of Binary Tree

水题,不解释。

[2012-09-28]Binary Tree Zigzag Level Order Traversal

层次遍历用队列,要求S形遍历,就把每一层的节点先推到一个列表里,然后根据层次的奇偶性从左往右或者从右往左扫。

[2012-09-28]Binary Tree Level Order Traversal

比上题更简单。

[2012-09-23]Symmetric Tree

对左子树求先序序列和中序序列,对右子树求镜像的先序序列和中序序列。


//End of Season 3


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值