Week 02 - Leetcode 11 - 20
11 - 盛最多水的容器
做法: 双指针扫描 哪个短指针就向内移动一个单位 并更新最大体积
证明:
设每一状态下水槽面积为 $S (i, j) (0<=i<j<n)$,由于水槽的实际高度由两板中的短板决定,则可得面积公式 $S(i,j)=min(h[i],h[j])×(j−i)$.
在每一个状态下,无论长板或短板收窄 1 格,都会导致水槽 底边宽度 − 1 : 若向内移动短板,水槽的短板 $min(h[i],h[j])$ 可能变大,因此水槽面积 $S(i,j) $可能增大。 若向内移动长板,水槽的短板 $min(h[i],h[j])$不变或变小,下个水槽的面积一定小于当前水槽面积。
以上保证我们一定可以遍历到最优解;
class Solution {
public:
int maxArea(vector<int>& height) {
int l = 0, r = height.size() - 1, res = 0;
while(l < r)
{
int hl = height[l], hr = height[r];
res = max(res, (r - l) * min(hl, hr));
if(hl < hr)
l++;
else
r--;
}
return res;
}
};12 - 整数转罗马数字
感觉就是模拟诶。。就嗯打表;
这里频繁拼接字符串要记得用stringstream, 别硬+=;
13 - 罗马数字转整数
依旧是模拟就完事了 注意一下两个字符连接的特殊情况;
相比于暴力枚举 这里可以找规律在于 例如IX, CD 这种情况的出现 I 表示的数字一定小于X;
也就是说只要左边的字母小于右边的字母, 那么左边的字母表示的就是负值;
NOTE: IX = 5 - 1; XC = 100 - 10; ...
14 - 最长公共前缀
这个就是拿个指针往后指就好了(x 同样的 拼接多个字符串记得用stringstream
15 - 三数之和
排序 然后双指针算法来解决,这里有一些重复元素的边界问题需要小心考虑一下
重复问题主要出现在一下几个地方:
NOTE: 1. 枚举起点时候 a a b 在枚举前一个a 的时候就考虑到了后面的情况 同时包含了a a 同时出现的情况 这个时候不必枚举后面一个a;
NOTE: 2. 在得到答案的时候 a bbb xxx ccc 已经得到一个答案a b c 之后 重复的b c 都可以直接过掉;
记住这两个过滤重复元素的地方就可以了;
16 - 最接近的三数之和
直接枚举:和上一题差不多 还少了判重
17 - 电话号码的字母组合
基础dfs
18 - 四数之和
和三数之和一样 只不过多枚举一个然后同样的判重小心一点
这里相当于三数之和是枚举完i的子问题;
19 - 删除链表的倒数第N个节点
可能会删除头结点 -> 虚拟头结点 先找到倒数第k-1个节点 使其指向k+1个节点
20 - 有效的括号
用栈来实现 可以发现ASCII码中 ( 与 ) 差1 [ 与 ] { 与 } 差2,所以可以直接用字符差值是否在2以内判断是否匹配 这里用模拟栈会更快一点
Last updated