leetcode:Container With Most Water

这道LeetCode题目要求在给定高度的数组中找到能容纳最大水量的两个板子组合。初始尝试的遍历方法会导致超时,通过优化,采用双指针策略,从两端开始移动,每次移动较矮的那块板子,以确保在遍历一次后找到最大面积。最终实现一次性遍历求解最大截面积。
摘要由CSDN通过智能技术生成
  1. 题目

    给定一系列整数代表在0,1,2,3...坐标点板的高度,求出在任意两个板之间能装水的最大截面积.

  1. 分析

       首先,我们会想到遍历下每一个板,选取任意两个板,求出最大的,但是这个会超时,效率太低

      

 其次,我们乐意想到在遍历的基础上优化,即有一个预测,这样可以在一定程度上提高效率,但是并不是太好,我试了下还


不能过.

    

 我们就要想,能不能遍历一遍就求出来.

    

    1:left = 0, right =height.size();

    

    2:如果left< right,3,否则四

   

   3:求出此时面积的大小,并判断左边和右边板的高度哪一个大,左边小于右边的话,left++;否则,right--;并判断是否  

Maxarea更新,返回2

   

   4:结束,返回最大面积


  穷举

class Solution {
public:
    int maxArea(vector<int> &height) {
        int area,Maxarea,high;
        Maxarea = 0;
        for(int i=0;i<height.size();i++){
        	if(height[i]==0) continue;
        	for(int j=0;j<i;j++){
        		area = (i-j)*(high=height[i]>height[j]? height[j]:height[i]);
        		if(area>Maxarea)
        			Maxarea = area;
        	}
        }
        return Maxarea;
    }
};
  预测优化

class Solution {
public:
    int maxArea(vector<int> &height) {
        int area,Maxarea,high;
        Maxarea = 0;
        for(int i=0;i<height.size();i++){
        	if(height[i]==0) continue;
        	int steplen = i - Maxarea/height[i];
        	for(int j=0;j<i&&j<=steplen;j++){
        		area = (i-j)*(high=height[i]>height[j]? height[j]:height[i]);
        		if(area>Maxarea)
        			Maxarea = area;
        	}
        }
        return Maxarea;
    }
};

   双指针

class Solution {
public:
    int maxArea(vector<int> &height) {
        int left = 0;
        int right = height.size() - 1;
        int area,Maxarea,high,step;
        Maxarea = 0;
        int flag;
        while(left<right){
        	area = (right-left)*(high=height[left]>height[right]? height[right]:height[left]);
        	if(height[left]<height[right])
        		left++;
        	else
        	    right--;        	
        	if(area>Maxarea)
        		Maxarea = area;
        }
        return Maxarea;
    }
};



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值