Leetcode总结帖1-10

Posted goldenticket

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode总结帖1-10相关的知识,希望对你有一定的参考价值。

1. Two sum

因为只有一个solution(pair),所以一旦发现解返回即可。使用unordered_map或者unordered_set存当前数字,找complement.

2. Add two number

双指针,使用dummy作为返回链表。

3. Longest substring without repeating characters

使用一个unordered_map存current char -> last appearred index,每次只要查看当前和上次出现的差值即是最长non repeating window

4. Median of two sorted arrays

类似merge sort,要用一个trick: ((m+n+1)/2 +(m+n+2)/2)/2=median,转化成分别找两次top k(log n)

5. Longest Palindromic Substring

方法1:每次从中间往外expand,分情况讨论:偶数个和奇数个,最后找最大

方法2:dp[i][j]表示s[i]~s[j]是回文,dp[i][i]=true,if 相邻: dp[j][i]=true if s[i]==s[j] else false,else dp[i][j]=dp[i-1][j+1] && s[i] == s[j](之前的都相同,同时当前的也相同)

 1 for (int i = 0; i < n; ++i) {
 2             dp[i][i] = 1;
 3             for (int j = 0; j < i; ++j) {
 4                 dp[j][i] = (s[i] == s[j] && (i - j < 2 || dp[j + 1][i - 1]));
 5                 if (dp[j][i] && len < i - j + 1) {
 6                     len = i - j + 1;
 7                     left = j;
 8                 }
 9             }
10         }

6. ZigZag Conversion

用vector<string>表示整个matrix,每次先从上往下扫(每次扫到某行就往后添加)添加竖直列,然后再从下往上添加斜边(范围从倒数第二个到正数第二个),以此类推

class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows <= 1) return s;
        string res;
        int i = 0, n = s.size();
        vector<string> vec(numRows);
        while (i < n) {
            for (int pos = 0; pos < numRows && i < n; ++pos) {
                vec[pos] += s[i++];
            }
            for (int pos = numRows - 2; pos >= 1 && i < n; --pos) {
                vec[pos] += s[i++];
            }
        }
        for (auto &a : vec) res += a;
        return res;
    }
};

7. Reverse Integer

每次res = num % 10 + res * 10, num /= 10. 注意越界问题

8. String to Integer

1. 若字符串开头是空格,则跳过所有空格,到第一个非空格字符,如果没有,则返回0.

2. 若第一个非空格字符是符号 +/-,则标记 sign 的真假,这道题还有个局限性,那就是在 c++ 里面,+-1 和-+1 都是认可的,都是 -1,而在此题里,则会返回0.

3. 若下一个字符不是数字,则返回0,完全不考虑小数点和自然数的情况,不过这样也好,起码省事了不少。

4. 如果下一个字符是数字,则转为整形存下来,若接下来再有非数字出现,则返回目前的结果。

5. 还需要考虑边界问题,如果超过了整型数的范围,则用边界值替代当前值。

 -- https://www.cnblogs.com/grandyang/p/4125537.html

9. Palindrome Number

使用第7题的方法反转数字,然后和原数字比较,corner case:如果是奇数位,那么比较reversed number / 10 ?= num.

10. Regular Expression Match

‘.‘ Matches any single character. ‘*‘ Matches zero or more of the preceding element.

使用递归查询两个字符的第一个char是否match,直到遇到第二个字符是*的情况,之后再处理重复*

1. s和跳过*之后的p是否match

2. s去掉第一个char之后时候和跳过*之后的p是否match

每次循环都会跳过第一个,这个while loop最终会在s跳光或者第一个s[0]!=p[0]中结束,最后只要再查一遍当前s和剩下的p是否match就可以了

1 while (!s.empty() && (s[0] == p[0] || p[0] == .)) {
2             if (isMatch(s, p.substr(2))) return true;
3             s = s.substr(1);
4         }
5 return isMatch(s, p.substr(2));

 

以上是关于Leetcode总结帖1-10的主要内容,如果未能解决你的问题,请参考以下文章

201871010119-帖佼佼《面向对象程序设计(java)》课程学习总结

2016百度之星总结帖

C语言表驱动法编程实践(精华帖,建议收藏并实践)

面试成长总结帖

SpringMVC总结帖

Spring之IoC总结帖