Leetcode总结帖【11-20】
11. Container with Most Water
使用双指针i和j,分别指向数组的两端。每次最大值是res = max(res, (j - i) * min(height[j], height[i]))。每次根据比较height[i]和height[j]的大小来更新i和j。
只有下一个height[i] or height[j]比当前的最大值要大才考虑更新下一个。
12. Integer to Roman
这道题只能硬做,算是一道实现题
1 string intToRoman(int num) { 2 string res = ""; 3 vector<int> val{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; 4 vector<string> str{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; 5 for (int i = 0; i < val.size(); ++i) { 6 while (num >= val[i]) { 7 num -= val[i]; 8 res += str[i]; 9 } 10 } 11 return res; 12 }
13. Roman to Integer
同上
1 int romanToInt(string s) { 2 int res = 0; 3 unordered_map<char, int> m{{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}}; 4 for (int i = 0; i < s.size(); ++i) { 5 int val = m[s[i]]; 6 if (i == s.size() - 1 || m[s[i+1]] <= m[s[i]]) res += val; 7 else res -= val; 8 } 9 return res; 10 }
14. Longest Common Prefix
如果是common prefix那么每一个string都会有,那么只要拿第一个做比对就可以。两个指针i:当前share的prefix的char的index,j:指向后面某一个string的index
15. 3Sum
使用双指针找当前元素的complement,但是使用的前提是数组要排好序。
while (current int)
while (left < right)
find sum such that [left] + [right] == target - int
if sum > target then right--
else left++
细节处理:跳过相同元素,因为最后需要返回的是所有组成方案
16. 3Sum Closest
依旧使用双指针,只不过加入一个新的diff变量
while (current int)
while (left < right)
diff = min(diff, target - current int - [left] + [right])
if sum > targe then right--
else left++
return diff
17. Letter Combination of a Phone Number
首先使用map存每个数字可以对应的字母,然后dfs每次遍历当前节点的状态
dfs函数:dfs(current index of 12, current node)
18. 4Sum
类似3Sum,只不过要在外围加一层遍历第二个元素,最后继续使用双指针找当前两个元素的complement,但是使用的前提是数组要排好序。
while (current first int)
while (current second int)
while (left < right)
find sum such that [left] + [right] + first + second== target - int
if sum > target then right--
else left++
19. Remove Nth node from the end of list
因为是单指针,所以要想remove需要找到当前的下一个和上一个元素,然后把两者相连即可。
使用快慢指针找当前节点的上n个元素。快节点要比慢几点快n个节点,那么当快节点到达队尾的时候慢节点刚好是第n个节点,这个时候慢节点的下下一个与慢节点相连接即可。
20. Valid Parentheses
使用stack来存当前的字符,使用map存opening -> closing char.
只要是key(是opening char)那么就push到stack中
else判断stack是否为空或者当前的top和当前的char不对应,返回false
其余情况说明当前的char和上一个match,那么直接pop掉上一个即可
最后如果stack是空即说明是valid
stack最后只存还未被match的opening char