LeetCode算法学习之盛最多水的容器
·
完整代码实现
class Solution {
public int maxArea(int[] height) {
List<Integer> result = new ArrayList<>();
int left = 0;
int right = height.length - 1;
while(left < right){
if(height[left] < height[right]){
int area = height[left] * (right -left);
left++;
result.add(area);
}else{
int area = height[right] * (right -left);
right--;
result.add(area);
}
}
int max = result.get(0);
for(int i = 1;i<result.size();i++){
if(result.get(i) > max){
max = result.get(i);
}
}
return max;
}
}
优化后代码
class Solution {
public int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int maxArea = 0; // 初始化最大容量为0
while (left < right) {
// 计算当前容量
int currentArea = Math.min(height[left], height[right]) * (right - left);
// 实时更新最大容量
maxArea = Math.max(maxArea, currentArea);
// 移动较短的边
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxArea;
}
}
优化后的代码:降低了空间复杂度,可以在循环中记录最大面积
解题思路:
1.采用双指针法来解决这个问题:
左指针left从数组起始位置开始
右指针right从数组末尾位置开始
通过比较两指针所指的高度,移动指针并计算当前容量
2. 代码具体实现步骤
1. 初始化:
创建一个ArrayListresult来存储所有可能的容量值
设置左指针left=0,右指针right=height.length-1
2. 双指针遍历:
当left < right时循环:a. 如果左边高度小于右边高度:
计算当前容量:area = height[left] * (right-left)
将容量加入result列表
左指针右移:left++b. 否则(右边高度小于等于左边高度):
计算当前容量:area = height[right] * (right-left)
将容量加入result列表
右指针左移:right--
3. 寻找最大容量:
初始化max为result的第一个元素
遍历result列表,找到最大的容量值
4. 返回结果:
返回找到的最大容量值max
更多推荐

所有评论(0)