代码随想录训练营第19天休息日|11. 盛最多水的容器
)
11.盛最多水的容器
思路
本来想的是维护两个队列,一个是从左到右升序,一个是从右到左升序,然后二层遍历,计算最大容量。
但是耗时非常久。
看完题解,发现题解用的是双指针,每次缩较低侧的窗口。
代码
// 双指针
class Solution {
public int maxArea(int[] height) {
int i, j;
int upper = 0;
i = 0;
j = height.length - 1;
while (i < j) {
upper = Math.max(upper, (j - i) * Math.min(height[i], height[j]));
if (height[i] < height[j]) {
++i;
} else{ //} if (height[i] > height[j]) {
--j;
}
}
return upper;
}
}
// 双队列
class Solution {
public int maxArea(int[] height) {
LinkedList<Integer> queue_r = new LinkedList<>();
LinkedList<Integer> queue_l = new LinkedList<>();
int i, n;
int upper = 0;
n = height.length;
for (i = 0; i < n; ++i) {
if (queue_l.isEmpty() || height[queue_l.getLast()] < height[i]){
queue_l.offer(i);
}
if (queue_r.isEmpty() || height[queue_r.getLast()] < height[n - i - 1]) {
queue_r.offer(n - i - 1);
}
}
for (Integer left: queue_l) {
for (Integer right: queue_r){
if (left >= right) {
break;
}
upper = Math.max(upper, (right - left) * Math.min(height[left], height[right]));
}
}
return upper;
}
}
总结
你问我为什么不写一个在双队列里用双指针
哈哈哈,我不去
上表司令官但是不许
算了不玩月光梗,老老实实写在这了好了
class Solution {
public int maxArea(int[] height) {
LinkedList<Integer> queue_r = new LinkedList<>();
LinkedList<Integer> queue_l = new LinkedList<>();
int i, n;
int upper = 0;
n = height.length;
for (i = 0; i < n; ++i) {
if (queue_l.isEmpty() || height[queue_l.getLast()] < height[i]){
queue_l.offer(i);
}
if (queue_r.isEmpty() || height[queue_r.getLast()] < height[n - i - 1]) {
queue_r.offer(n - i - 1);
}
}
Integer left = queue_l.poll();
Integer right = queue_r.poll();
while (left != null && right != null && left < right) {
upper = Math.max(upper, (right- left) * Math.min(height[left], height[right]));
if (height[left] < height[right]) {
left = queue_l.poll();
} else {
right = queue_r.poll();
}
}
return upper;
}
}