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。

经验分享 程序员 微信小程序 职场和发展