LeetCode题目:11. 盛最多水的容器

题目

在这里插入图片描述

解析

  1. 这道题就是给你个一维数组,然后数组的索引表示位置,数组的值表示高,然后根据 尾索引 - 首索引 得到底,然后 底 * 高 得到水的面积,然后求这组数据中最大的值
  2. 知道具体题意之后,这题怎么解呢?
  3. 首先一个最简单的方法,就是暴力解法,把所有的结果求出来,两个for循环,从第一索引开始,第一遍先遍历全部数组的值,求出最大值,第二遍从第二个索引开始遍历,一次类推,这样就能得到一个最大的值。
  4. 上面的方法太简单了,所以就不做代码展示了,主要是要讲解下面一个方法,双指针法。
  5. 这道题我一看就知道是双指针,不过一开始我想的是一前一后地双指针,遇到一些特殊的情况得到的答案不对。后来我想了一下,应该前后双指针,具体怎么做,我下面讲解

双指针解法

  1. 首先,我们创建两个指针,分别指向 1 和 7,这样我们就可以算他们的面面积了,1 * (8-0) = 8
    在这里插入图片描述
  2. 好计算完了,然后重点是接下来怎么变动,指针怎么动可以使得面积最大,按照贪心的思想肯定是 值小的往前走,因为如果你把大的往前走,底只会减一,但值可能小的很多,如果值小的走,就是按照找最大的思路走。所以我们让left指针往前走。
    在这里插入图片描述
  3. 计算出来的面积是 7 *(8-1)= 49 ,进行比对,发现7比8小,所以7往前一步
    在这里插入图片描述
  4. 以此类推,最后发现最大值只能是49,所以得出答案
  5. 代码如下:
class Solution {
    public int maxArea(int[] height) {
    	int res = 0;
    	int left = 0;
    	int right = height.length - 1;
    	while (left < right && right > 0) {
			int x = right - left;
			int y = Math.min(height[right], height[left]);
			res = Math.max(res, x*y);
			if (height[left] < height[right]) {
				left ++;
			}else {
				right --;
			}
		}
        return res;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值