力扣:盛最多水的容器

文章介绍了两种解决求最大水量问题的方法。第一种是枚举法,虽然能得出正确答案但时间复杂度高,为O(n^2)。第二种是双指针法,其时间复杂度降低至O(n),更优。双指针法通过移动左右指针并计算最小高度与宽度的乘积来寻找最大水量,有效减少了比较和计算次数。
摘要由CSDN通过智能技术生成

 第一种:枚举(略微优化,不超时)

public int maxArea(int[] height) {
    int max = 0; // 最大水量

    // 从左往右遍历左半部分
    for (int i = 0; i <= (height.length - 1) / 2; i++) {
        for (int j = height.length - 1; j > i; j--) {
            if (height[i] <= height[j]) {
                max = Math.max(max, (j - i) * height[i]); // 计算当前容器的水量并更新最大水量
                break; // 因为移动右指针 j 时,容器的宽度只会减小,而高度不变或增加,因此不需要再继续循环
            }
        }
    }

    // 从右往左遍历右半部分
    for (int i = (height.length - 1) / 2 + 1; i < height.length; i++) {
        for (int j = 0; j < i; j++) {
            if (height[i] <= height[j]) {
                max = Math.max(max, (i - j) * height[i]); // 计算当前容器的水量并更新最大水量
                break; // 因为移动左指针 j 时,容器的宽度只会减小,而高度不变或增加,因此不需要再继续循环
            }
        }
    }

    return max; // 返回最大水量
}

 第二种:双指针

public int maxArea(int[] height) {
    int left = 0; // 左指针
    int right = height.length - 1; // 右指针
    int max = 0; // 最大水量

    while (left < right) {
        // 计算当前容器的水量并更新最大水量
        max = Math.max(max, (right - left) * Math.min(height[left], height[right]));

        // 移动指针的策略:
        // 如果左边界的高度小于右边界的高度,那么向右移动左指针,寻找可能更大的水量
        // 如果右边界的高度小于等于左边界的高度,那么向左移动右指针,寻找可能更大的水量
        if (height[left] > height[right]) {
            right--;
        } else {
            left++;
        }
    }

    return max; // 返回最大水量
}

  第一种思路是,先从左往右遍历数组,找到每个位置作为容器左边界时的最大水量;然后从右往左遍历数组,找到每个位置作为容器右边界时的最大水量;最终返回两次遍历得到的最大水量中的较大值作为结果。

  然而,这个解法的时间复杂度较高,为 O(n^2),其中 n 是数组的长度。因为使用了两层嵌套循环,每次遍历都需要进行大量的比较和计算,导致时间复杂度较高。

  相比之下,使用双指针法的解法在时间复杂度上更优,仅为 O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值