leecode-11盛最多水的容器C版-双指针的使用
1. 盛最多水的容器
描述:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。 输入:height = [4,3,2,1,4] 输出:16
2.双指针
双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
3.代码
解题思路:创建两个指针分别指向数组的开始和结束,因为在长度不变的情况下面积的大小由短的一端的高来决定,得到“长*短一端的高”得到初始面积,所以移动短的一端来寻找更长的高度就能得到更大的面积,用这个面积不断与初始面积比较;若大于则覆盖初始面积。
#include <stdio.h>
#include <string.h>
int maxArea(int* height, int heightSize){
int end; //end指针指向数组结尾
int start=0; //start指向数组开头
int maxArea=0; //最大面积
int Area=0; //当前面积
end=heightSize-1;
while(start!=end) /
{
Area=(end-start)*((height[start] <= height[end]) ? height[start] : height[end]); //寻到到高的一端后,计算面积
maxArea = Area >maxArea ? Area: maxArea; //与最大面积比较,看是否替代最大面积
if(height[start]>height[end]) //判断那边是短的一端
{
end--; //移动寻找高的一端
}
else
{
start++; //移动寻找高的一端
}
}
return maxArea;
}
int main()
{
int hight[]={
1,8,6,2,5,4,8,3,7};
int len,maxarea;
len=sizeof(hight)/sizeof(hight[0]);
maxarea=maxArea(hight,len);
printf("最大面积为:%d",maxarea);
return 0;
}
博主学到了: x>y? x: y 解释:如果x大于y这返回x,否则返回y。
下一篇:
最小生成树(邻接表写法)
