LeetCode每日一题 003 盛最多水的容器

1、解题思路


想法一:

盛水最多,即左右两边中间区域的矩形面积最大,称左侧为A边,右侧为B边。

比较直观的解法是,固定某一边(如A边),依次比较B边选取哪一个所框住区域面积最大。因此,可以比较选取不同A边所能框住面积的最大值,从而得到所有可能情况的最大值,及穷举法。可通过双层循环求解。

想法二:

在想法一基础上,思考固定A边,移动B边求取最大面积(即内层循环)这一操作是否有规律可循。通过举例可知,这一循环主要变量是A B之间的宽度。假设A边恒定低于B边,则A B距离最远时框住矩形面积最大。鉴于此,可在优先保证矩形宽度最大时,比较选取不同A、B边时矩形的面积。

1)设定游标left、right指向首尾两边;设定maxArea保持当前已知最大面积;

2)计算left、right间面积area,与当前已知最大面积maxArea比较,如更大,则更新maxArea;

3)比较left、right处两边高度h1、h2,若h1<h2,向右移动left,反之向左移动right;

4)重复2)、3)步骤直到left和right指向同处

2、有效题解


1)穷举

int maxArea(int* height, int heightSize) {
    if (NULL == height || heightSize < 2)
    {
        return 0;
    }
    
    int maxArea = 0;
    int hgt = 0;
    int area = 0;
	for (int i = 1; i < heightSize; i++)
	{
		for (int j = 0; j < i; j++)
		{
			hgt = (height[i] > height[j]) ? height[j] : height[i];
			area = hgt * (i - j);

			maxArea = (maxArea < area) ? area : maxArea;
		}                                   
	}

	return maxArea;
}

2)双边移动

int maxArea(int* height, int heightSize) {
    if (NULL == height || heightSize < 2)
    {
        return 0;
    }
    
    int left = 0;
    int right = heightSize - 1;
    int maxArea = 0;
    int hgt = 0;
    int area = 0;
    
    while (left < right)
    {
        hgt = (height[left] < height[right]) ? height[left] : height[right];
        area = hgt * (right - left);
        maxArea = (area > maxArea) ? area : maxArea;
        
        if (height[left] <= height[right])
        {
            left++;
        }
        else
        {
            right--;
        }
    }
    
    return maxArea;
}

3、小结


1、系统有多个变量时,先固定某个变量来对系统进行分析

2、善于发现系统中的规律,可通过举例、对比、归纳来摸索

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值