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。
下一篇:
最小生成树(邻接表写法)