系列文章目录
**
实现盛最多水的容器问题的解决
**
前言
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/container-with-most-water
提示:以下是本篇文章正文内容,下面案例可供参考
一、实例演示一
二、实例演示二
三、具体方法讲解
方法一(暴力法,类比握手问题)
int maxArea(int* height, int heightSize) {
int *max = (int*)malloc(sizeof(int)*heightSize);
int i = 0;
int j = 0;
int high = 0;
int area = 0; 存储当前过程的容积
int max2 = 0; //存储之前过程中的最大值
for (i = 0; i < heightSize; i++)//每一位都要考虑,寻找两个人直接的差
{
for (j = i + 1; j < heightSize; j++)
{
high = ((height[i] < height[j]) ? height[i] : height[j]);//短板效应,需要考虑最短的板作为水桶的高
area = tmp * (j - i); //容积底乘高
if (max2 < area)
{
max2 = area;
}
}
}
return max2;
}
方法二:双指针方法
第一次指针位置,计算面积
第二次指针的位置
第三次指针的位置
通过三次的进行比较,发现涉及两个指针一左一右,通过计算面积,一般是需要长,宽都大面积才会大,所以我们通过判断指针所指值的大小来比较
大的不动,小的向内部移动。直到两个指针指向同一个数。
int maxArea(int* height, int heightSize)
{
int* left = height;
int* right = height + heightSize-1;
int maxh = 0;
int area = 0;
int max = 0;
int wide = heightSize-1;//宽,每次都需要移动一位,所以设计宽可以直接采用数组长度来确定,宽度是中间距离所以要减一
while (left < right)
{
maxh = (*right < *left) ? (*right): (*left);//判断高
//printf("%d\n", maxh);
area = wide* maxh;
if (max < area)
max = area;
if (*left < *right)//判断指针向那边移动
{
left++;
}
else
{
right--;
}
wide--;
}
return max;
}
整体代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//int maxArea(int* height, int heightSize) {
// //int *max = (int*)malloc(sizeof(int)*heightSize);
// int i = 0;
// int j = 0;
// int tmp = 0;
// //int tmp1 = 0;
// int max1 = 0;
// int max2 = 0;
// for (i = 0; i < heightSize; i++)
// {
// for (j = i + 1; j < heightSize; j++)
// {
// tmp = ((height[i] < height[j]) ? height[i] : height[j]);
// max1 = tmp * (j - i);
// if (max2 < max1)
// {
// max2 = max1;
// }
// }
//
// }
// return max2;
//}
int maxArea(int* height, int heightSize)
{
int* left = height;
int* right = height + heightSize-1;
int maxh = 0;
int area = 0;
int max = 0;
int wide = heightSize-1;
while (left < right)
{
maxh = (*right < *left) ? (*right): (*left);
//printf("%d\n", maxh);
area = wide* maxh;
if (max < area)
max = area;
if (*left < *right)
{
left++;
}
else
{
right--;
}
wide--;
}
return max;
}
int main()
{
int height[9] = { 1,8,6,2,5,4,8,3,7 };
int heightSize = 9;
int m = maxArea(height, heightSize);
printf("%d", m);
return 0;
}
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了如何解决此类问题,希望大家可以点赞哦