leetcode 11. 盛最多水的容器 -java

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

代码:

复制代码
public static void main(String[] args) {
    int[] height = new int[]{1,8,6,2,5,4,8,3,7};
    // 思路: 两个指针 leftIndex rightIndex  水的面积 = min(height[leftIndex],height[rightIndex]) * (rightIndex-leftIndex) 循环比较获取较大的那个面积
    Integer maxSize = 0;
    for (int leftIndex = 1; leftIndex < height.length+1 ; leftIndex++) {
        for (int rightIndex = 1; rightIndex < height.length+1 ; rightIndex++) {
            maxSize = Math.max(maxSize,Math.min(height[leftIndex],height[rightIndex])*(rightIndex-leftIndex));
        }
    }
    return maxSize;

}

双层for循环嵌套-超出时间限制

改进:接水 - 接多少水取决于短版的长度,所以可以使用双指针法,每次比较,保留较大元素的指针不动,较小元素的指针平移寻找更大的指针,直到两个指针相遇

这是因为木桶底部长度在指针在两头时是最大的,指针内移x轴长度一定会减小,这时如果想要获取更大面积,需要获取两个height里较小的那个,让他增大,面积才会增大,所以较小的元素的指针向内循环,寻找更大的值,一直到左右两个指针重合,结束循环

代码:

复制代码
public static void main(String[] args) {
    int[] height = new int[]{1,8,6,2,5,4,8,3,7};

    int left = 0, right = height.length - 1;
    int ans = 0;
    while (left < right) {
        int area = Math.min(height[left], height[right]) * (right - left);
        ans = Math.max(ans, area);
        if (height[left] <= height[right]) {
            ++left;
        }
        else {
            --right;
        }
    }
    return ans;
}

思考:遇到双层for循环,需要思考能否用双指针解决性能问题

相关推荐
TT哇3 分钟前
【优先级队列(堆)】2.数据流中的第 K ⼤元素(easy)
算法·1024程序员节
Matlab程序猿小助手36 分钟前
【MATLAB源码-第303期】基于matlab的蒲公英优化算法(DO)机器人栅格路径规划,输出做短路径图和适应度曲线.
开发语言·算法·matlab·机器人·kmeans
不爱编程的小九九36 分钟前
小九源码-springboot097-java付费自习室管理系统
java·开发语言·spring boot
CoderIsArt42 分钟前
CORDIC三角计算技术
人工智能·算法·机器学习
立志成为大牛的小牛42 分钟前
数据结构——二十九、图的广度优先遍历(BFS)(王道408)
数据结构·数据库·学习·程序人生·考研·算法·宽度优先
Alex艾力的IT数字空间1 小时前
基于PyTorch和CuPy的GPU并行化遗传算法实现
数据结构·人工智能·pytorch·python·深度学习·算法·机器学习
仰泳的熊猫1 小时前
LeetCode:51. N 皇后
数据结构·c++·算法·leetcode
独自破碎E1 小时前
LeetCode 381: O(1) 时间插入、删除和获取随机元素 - 允许重复
java·算法·leetcode
程语有云1 小时前
生产事故-Caffeine缓存误用之临下班的救赎
java·缓存·caffeine·阻塞·log·生产事故
Miraitowa_cheems1 小时前
LeetCode算法日记 - Day 81: 最大子数组和
java·数据结构·算法·leetcode·决策树·职场和发展·深度优先