力扣(LeetCode)容器装水问题

题目描述

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

图中垂直线代表输入数组 1,8,6,2,5,4,8,3,7。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例:

输入:1,8,6,2,5,4,8,3,7

输出:49

链接:https://leetcode-cn.com/problems/container-with-most-water

白话题目:

数组给出的是挡板的高度,看看两个板之间能装装的最多水,也就是求那个面积。这个题不是脑筋急转弯,所以不让你倾斜。

算法:

(1)木桶原理是原则之一,两个板确认后,高度和最矮的相关

(2)S=height*longth,长度是两个板之间的距离

(3)巧妙的做法是利用双指针解决。

L R标注左右位置

那个的数小就移动哪边的指针

maxArea=max(maxArea,min(heightL,heightR)*(R-L));

C语言代码实现

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
int max(int a, int b){
	return a>b?a:b;
}
int min(int a, int b){
	return a<b?a:b;
}
int maxarea(int* height, int heightsize){
	int maxarea =0;
	int L=0;
	int R = heightsize-1;
	while(L<R){
		maxarea= max(maxarea, min(height[L],height[R])*(R-L));
		if(height[L]<height[R]){
			L++;
		}
		else{
			R--;
		}
	}
	return maxarea;
}
int main(){
	int heightsize;
	int result;
	scanf("%d",&heightsize);
	int height[heightsize];
	for(int i=0;i<heightsize;i++){
		scanf("%d",&height[i]);
	}
	result = maxarea(height, heightsize);
	printf("%d",result);
}
相关推荐
atunet12 分钟前
关于稀疏图结构的高效存储与遍历算法设计的技术7
算法
ysa05103012 分钟前
【并查集】判环,深搜
数据结构·c++·算法·深度优先
Jerry17 分钟前
LeetCode 704. 二分查找
算法
Gp7HH6hrE33 分钟前
P1118 [USACO06FEB] Backward Digit Sums G/S
算法·深度优先
LDR00633 分钟前
LDR6500赋能POS机底座:单口Type-C供电、维护与产测一体化解决方案
大数据·c语言·人工智能
AI科技星37 分钟前
32维超复数流形中意识信息场与物质耦合的拓扑动力学
人工智能·学习·算法·数据挖掘·回归·乖乖数学·全域数学
鱼很腾apoc1 小时前
【Linux】第7期 进程间通信 (IPC) 详解:管道 (匿名 / 命名) + System V
linux·服务器·c语言·学习·进程间通信·ipc
YuK.W1 小时前
Leetcode100: 94.二叉树中序遍历、104.二叉树最大深度、226.翻转二叉树
java·算法·leetcode·二叉树
气泡音人声分离2 小时前
技术解析|均衡器(EQ)工作原理与实操指南:从频率拆分到听感优化
算法·均衡器·音频剪辑
weixin_413063212 小时前
复现 MatchED 边缘检测模型(单张图片重复8次,训练200 epoch)
python·算法·计算机视觉·边缘检测模型