LeetCode解题思路(1)

屌丝程序猿的LeetCode刷题记【第一季——第1~50题】:

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

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

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

--------------------------------

[2012-03-19]N-Queens

类似N-Queens II,逐层递归求解。

[2012-03-19]Pow(x, n)

基本思想是利用x^n=x^(n/2)*x^(n/2),注意x^(n/2)只需要计算一次,这样就把时间复杂度降到了O(logn)。刚开始写的时候x^(n/2)算了两次,所以时间复杂度仍是O(n),必然TLE……另外注意单独处理n==INT_MIN的情况。

[2012-03-19]Anagrams

理解题目要求理解了半天,其实就是对原字符串数组按anagram的定义进行分组,输出组内元素个数>1的所有字符串。先遍历一遍,按字母序对字符串进行排序,得到出现过多次的anagram的集合,再遍历一遍,将排序后存在于该集合中的所有字符串添加到结果列表里。若字符串长度认为是常数级,则时间复杂度:O(n)。

[2012-03-17]Rotate Image

对矩阵划分“田”字格,注意区分奇数和偶数情况下的边界条件。

[2012-03-16]Permutations II

在下题Permutations的交换思想基础上,第i层先记录num[i..]中每个数第一次出现的索引,然后将这些索引对应的数和第i个数交换,交给下一层处理。

[2012-03-16]Permutations

逐层递归,第i层将第i个数与后面(包括第i个数在内)的每一个数进行交换,然后交给下一层处理。

[2012-03-16]Jump Game II

设置4个变量,分别保存p:从左到右扫过的位置;mx:当前能到达的最远点;tmp:暂存上一步能到达的最远点;res:步数的计数变量。第i次循环以tmp(前i-1次能到达的最远点)为上界,p往右移,计算途径的点能达到的最远点,将其中的最大值赋给mx,每做一次这样的循环,res加1。

[2012-03-15]Wildcard Matching

至今没过……

[2012-03-12]Multiply Strings

大数乘法,用sum和adder逐位乘完然后加就可以了。

[2012-03-10]Trapping Rain Water

一维动态规划:对于每个点,其左侧最大值和右侧最大值的较小值就是这个点能容纳的水量的最高点。

[2012-03-08]First Missing Positive

从左往右扫,若当前位置的值所指向的索引(比如值3指向的是第三个索引,即[2])不是当前位置且该索引位置上的值与当前位置的值不相等,则交换;否则当前位置右移。这样做能保证每个正数至多只被交换一次,时间复杂度:O(n)。

[2012-03-06]Combination Sum II

先得出数组中每个出现的数及其出现的次数(2个数组),然后逐层递归,由于所有数都是正数,所以当累计的值大于target的时候就可以停了。

[2012-03-06]Combination Sum

和上题类似,不同的是每个数可以取任意次。

[2012-03-05]Count and Say

数组操作,很烦的一道题,用一个字符串保存当前状态,两个索引指针p、q扫描连续出现的元素,构造新字符串。

[2012-03-04]Sudoku Solver

恶心的题,写了200+行代码。用到了两种策略:1.用至多81个HashSet保存每个未确定的格子中可填的数,主要是用格子所在的行、列、3x3单元来进行过滤;2.对每行(以及每列、每个3x3单元)还没填上的数字,根据HashSet判断该数字能够填到哪个格子里,若唯一,则可以直接填上。每次循环先执行策略1,若策略1不能进一步填充,则执行策略2,若两种策略都不能进一步填充,则递归分支搜索。

[2012-03-03]Valid Sudoku

刚开始以为是像上题一样判断数独的当前布局有没有解,折腾了半天没折腾出来……后来觉得是不是只让判断当前布局是不是满足数独的基本要求,试着写了写代码,过了,瞬间释然……

[2012-03-03]Search Insert Position

简单的二分搜索,可以先把左右边界处理一下。时间复杂度:O(logn)。

[2012-03-02]Search for a Range

两次二分查找,分别寻找左端点和右端点。将[low,high]分成[low,mid]和[mid+1,high]进行查找,找左端点时比较[mid]和target,找右端点时比较[mid+1]和target。时间复杂度:O(n)。

[2012-03-02]Search in Rotated Sorted Array

没有重复元素的旋转数组,分三种情况二分。

[2012-02-29]Longest Valid Parentheses

顺序扫描字符串,用一个栈存放还未匹配的左括号索引和已不可能被匹配的右括号索引。所以,每扫到一个左括号,则索引进栈;每扫到一个右括号,若栈顶是左括号索引,则出栈并计算此次匹配的长度(出栈后若栈空则表示可以一直匹配到最左端,否则表示只能匹配到出栈之后的栈顶索引),否则(栈空或栈顶是右括号索引)说明该右括号不能被匹配,因此索引进栈。时间复杂度:O(n)。

[2012-02-25]Next Permutation

从后向前找非增区间[i+1,n),则有[i]<=[i+1],在此区间中从后向前找到第一个大于[i]的[j],交换[i]和[j],然后把区间[i+1,n)调成非减区间。时间复杂度:O(n)。

[2012-02-23]Substring with Concatenation of All Words

先用一个Map保存L中的单词和每个单词出现的次数,设L中的所有单词加起来长度为len,然后对S所有长度为len的子串,按L中单词的长度进行切割,得到一个单词列表,将此列表中的单词与Map中的单词比较,注意扫描过程中及时剪枝。时间复杂度:O(mn)。(n:S的长度;m:L的长度)

[2012-02-18]Divide Two Integers

将除数和被除数转成字符串模拟笔算除法的过程,要考虑的边界情况很烦。

[2012-02-18]Implement strStr()

懒得看KMP了,暴力解决!@#¥%……

[2012-02-16]Remove Element

水题,不解释。

[2012-02-16]Remove Duplicates from Sorted Array

利用两个索引变量p、q,q每扫到一个第一次出现的数就停下,赋给p指向的位置并将p后移。处理后的数组长度由p的最终位置决定。

[2012-02-15]Reverse Nodes in k-Group

很烦的指针操作。

[2012-02-14]Swap Nodes in Pairs

上题k=2的情况。

[2012-02-13]Merge k Sorted Lists

递归分治,时间复杂度O(nlogn),n是这k个链表长度的总和。

[2012-02-12]Generate Parentheses

二叉递归:左括号数<n时可以加一个左括号进入下一层;右括号数小于左括号数时可以加一个右括号进入下一层。

[2012-01-30]Valid Parentheses

用一个栈存放未匹配的左括号,来一个右括号,判断是否与栈顶的左括号匹配,发现一次不匹配即返回false,扫完若栈空则说明完整匹配。

[2012-01-27]Remove Nth Node From End of List

用两个指针定位到倒数第n个节点(及其前驱)。边界情况是n等于链表长度。

[2012-01-26]Letter Combinations of a Phone Number

用队列解决乘法原理相关问题的典型。当然,貌似递归是最常规的做法……

[2012-01-26]4Sum

排序之后,从左到右取[i],然后对[i+1..]计算3Sum。时间复杂度:O(n^3)。

[2012-01-18]3Sum Closest

按3Sum的思路做。时间复杂度:O(n^2)。

[2012-01-17]3Sum

排序之后,从左到右取[i],然后对[i+1..]计算2Sum。时间复杂度:O(n^2)。

[2012-01-17]Longest Common Prefix

先把res赋成第一个字符串,后面每个字符串依次与res求最长前缀,并将结果赋给res。

[2012-01-15]Roman to Integer

没意思……

[2012-01-15]Integer to Roman

没意思……

[2012-01-08]Container With Most Water

先把左右端点定为i=0,j=n-1。i和j不断向中间靠拢,若[i]<[j],则i右移;否则j左移。移动的过程中找到的最大值即是答案。首先,若[i]<[j],则此时[i]和[>j]形成的面积已扫过,而[j]继续左移只会使面积减小,因此以[i]为左端点的最大面积已找到,因此可以右移;其次,扫描完之后,i+1=j,即:以[≤i]为左端点的最大面积和以[≥j]为右端点的最大面积均已找到,这涵盖了所有情况,证毕!时间复杂度:O(n)。

[2012-01-08]Regular Expression Matching

递归匹配,不会超时……

[2012-01-04]Palindrome Number

按Reverse Integer的做法写了写代码,竟然过了……!(题目本意是否应该是用栈和队列来做?O(1)的空间复杂度算不算without extra space?)

[2011-12-26]String to Integer (atoi)

面试中被考到写代码次数最多的一道题!用最直观的思路处理边界很烦人,其实应该可以搞个DFA来做。

[2011-12-25]Reverse Integer

没有针对溢出的测试用例,水题。

[2011-12-05]ZigZag Conversion

用nRows个字符串暂存每一行的结果,顺序扫描每个字符,最后把nRows个结果串起来。时间复杂度:O(n)。

[2011-11-11]Longest Palindromic Substring

O(n)复杂度的算法实在超出了我的智商承受范围……写了个O(n^2)的准暴力算法,过了。

[2011-11-01]Add Two Numbers

类似于大数加法,用sum和adder暂存每一位的相加结果和进位,没有特别需要注意的。

[2011-05-15]Longest Substring Without Repeating Characters

用两个长度为95(ASCII字符个数)的数组分别保存每个字符在当前窗口中是否出现已经最后出现的索引。顺序扫描,当碰到重复出现的字符时,就把扫描指针设为重复字符的最后出现位置,清空数组,然后从0开始算新子串的长度。

[2011-03-27]Median of Two Sorted Arrays

水题,不知道为啥通过率这么低……

[2011-03-13]Two Sum

先排序,然后从两头往中间找。由于答案是唯一的,所以可以在找到这俩数之后再去原数组中定位索引。时间复杂度:O(nlogn)。


//End of Season1



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值