leetcode刷题记录

1. Two Sum  (2016.10.11)

题意:给一组数,寻找其中和为target的两个数,返回他们的index。

解法:暴力可过,map可过(技巧是边维护边遍历,这样可以剔除相同数不同index的情况),set可过(也是边维护边遍历)。


2. Add Two Numbers  (2016.10.12)

题意:将两个用链表反向存储的数做加法,求结果。e.g   l1: 7 -> 8 -> 9,l2: 7 -> 1 -> 4 -> 5, sum = l1 + l2 = 6404,sum: 4 -> 0 -> 4 -> 6。

解法:大数加法的链表形式,链表的操作用的尾插法。易错点1:两数长度不同加法进位。易错点2:数全加完了,还余进位。


*3. Longest Substring Without Repeating Characters  (2016.10.13)

题意:找到一个string不出现重复字符的最长连续子串。e.g "pwwkew" -> "wke" -> 3。

解法:从当前字符往前找到与其相同的第一个字符,计算其间的长度,但这里会出现一个问题,比如"wabbqw",会误算成6。引入一个fr改变其起点,每次这样在更新字符b的时候会把起点更新到第二个b。但这样这里的问题还是依旧存在,因为更新最后w的时候fr还是会跳回第一个w,因此更新必须有条件,即fr <= preIndex[s[to]]。


*4. Median of Two Sorted Arrays (2016.10.25)

题意:给两个已排序的数组,要求在O(log(m + n))的复杂度内招到他们的中位数。m,n为数组长度。

解法:这题好难。看了题解:https://discuss.leetcode.com/topic/16797/very-concise-o-log-min-m-n-iterative-solution-with-detailed-explanation/2

厉害的想法点有两个,其一是类似之前做快速回文串的算法一样加了虚位“#”,其二是把在第一个数组cut的地方与第二个数组cut的地方联系起来,那么就可以进行二分了。


5. Longest Palindromic Substring (2016.10.25)

题意:给一个字符串,找其最长回文子串。

解法:用manacher算法,复杂度O(n)。


6. ZigZag Conversion (2016.11.8)

题意:给一个字符串,你把这个字符串按照‘Z’字(zigzag)走法排完,然后按照横向重新排列返回字符串。如下长度为20的字符串:

1       9              17
2     8 10         16  18
3   7   11     15      19
4 6     12  14         20
5       13             
排完后是1 9 17 2 8 10 16 18.....

解法:找规律,第一行和最后一行特判,index每次加(numRows - 1) << 1;中间行一次加(numRows - i) << 1,一次加(i - 1) << 1交替。套上两重循环就行了。


7. Reverse Integer  (2016.11.9)

题意:给一个int,把数字反向输出,不输出前导0,若输出的反向数字超出int型,输出0。

解法:精度恶心到了,如果输入是 -2^31,在第一步处理负号的时候用int直接就wa了。改一下就ok了。int范围是(-2^31) ~ (2^31 - 1)。


8. String to Integer (atoi)  (2016.11.10)

题意:atoi的实现。

解法:比昨天要注意的点多,有非法字符输出0,前导的单个+和-还有0忽略,超范围返回INT_MAX或INT_MIN。


9. Palindrome Number  (2016.11.10)

题意:判断一个整数是不是回文数。

解法:参考题目7,把数字反过来判断是不是相等就好了,注意long long。负数不是回文数。


*10. Regular Expression Matching  (2016.11.16)

题意:"."可以代替任何字母,"*"可以表示其前面有*个字母。比如"a*",可以代表有0个a,1个a,...。比如".*",可以代表有0个.,1个.,...。

解法:DP > 懵逼 > 题解 > 原来是这样。(https://discuss.leetcode.com/topic/6183/my-concise-recursive-and-dp-solutions-with-full-explanation-in-c/2)


*11. Container With Most Water  (2016.11.22)

题意:依次给出坐标系上的直线(i, 0)-----(i, a_i),i=1,2,........n。选出两条直线,使得其可以倒入水面积最大。

解法:又菜又气.jpg。开始题意理解错了,以为是单调栈。n方超时。O(n)的做法是:https://leetcode.com/articles/container-most-water/,其中有证明。


12. Integer to Roman   (2016.11.24)

题意:给一个1~3999的整型,转换为罗马数字。

解法:知道规则之后,有点类似进制转换。


13. Roman to Integer  (2016.11.24)

题意:如12题,罗马数字转整数。

解法:同上。


14. Longest Common Prefix  (2016.11.26)

题意:给一组字符串,求他们的最长公共前缀。

解法:暴力可A,二分可A;字典树也可以,字典树还没试验。


15. 3Sum  (2016.11.30)

题意:给一组数,求其中三个数的和为0的所有不重复的组合,输出。

解法:O(n^2)解法的经典问题,特别是内循环像二分一样的加减标号有启发性。然而这题要去重,几个条件需要细细推一推。


*16. 3Sum Closest (2016.12.04)

题意:给一组数,求其中三个数的和距离target最近的和为多少。

解法:与上题类似。


17. Letter Combinations of a Phone Number  (2016.12.05)

题意:数字键盘字母,给数,求所有字母的组合。

解法:夏令营时候机试题,当时固定了长度为3。此题没有固定长度,但数据量不大,直接dfs过了。复习了一下函数的引用操作( 定义:void fun(Type &a),调用:fun(a))。


18. 4Sum  (2016.12.06)

题意:给一组数,求其中四个数的和为target的所有组,不重复,输出。

解法:与3Sum类似,加一重循环,去重。


19. Remove Nth Node From End of List  (2016.12.07)

题意:给一个单链表,删除倒数第n个元素。

解法:之前LGG在面网易的时候遇到了这题,他回来和我说过。只扫一趟,用的方法像顶杆子一样,确定起点中点顶着杆子扫到末尾就行了。


20. Valid Parentheses  (2016.12.08)

题意:判断括号(){}[],是否匹配。

解法:老问题,栈解决。


21. Merge Two Sorted Lists  (2016.12.11)

题意:给两个sorted链表,组成一个总的sorted链表返回。

解法:模拟可行,但卡了一个当 l->next == NULL 不能访问的情况。递归的写法非常好看,而且也不存在这种问题。


22. Generate Parentheses  (2016.12.11)

题意:给一个数字n,求出所有合法的n对圆括号匹配 “()”。

解法:dfs。


23. Merge k Sorted Lists  (2016.12.17)

题意:同21,给k个sorted链表,组成一个总的sorted链表返回。

解法:调用21题递归merge两个链表的算法,不断merge到只剩一个list即可。


24. Swap Nodes in Pairs  (2016.12.18)

题意:交换链表里面两两的node。

解法:递归。


25. Reverse Nodes in k-Group  (2016.12.20)

题意:链表每组翻转k个元素。

解法:递归,基操作是翻转k个元素。


26. Remove Duplicates from Sorted Array  (2016.12.20)

题意:sorted的数组,去重。

解法:扫一遍ok。


27. Remove Element  (2016.12.21)

题意:删除值为val的元素。

解法:扫一遍搞定。


28. Divide Two Integers  (2017.2.17)

题意:不用除法取模加法实现除法。

解法:位运算。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值