jadvpetc

导航

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

 

posted on 2020-01-30 22:31  jadvpetc  阅读(158)  评论(0编辑  收藏  举报