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. 还需要考虑边界问题,如果超过了整型数的范围,则用边界值替代当前值。
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));