力扣(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(height[L],height[R])*(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);
}
相关推荐
星爷AG I1 分钟前
14-4 运动控制理论:协同理论(AGI基础理论)
算法·机器学习·agi
I_LPL21 分钟前
day48 代码随想录算法训练营 图论专题1
java·算法·深度优先·图论·广度优先·求职面试
absunique28 分钟前
多路归并算法在外部排序中的实现与优化的技术7
算法
鹿鸣悠悠34 分钟前
【AI-08】Prompt(提示词)
人工智能·算法
数据中穿行36 分钟前
12种经典排序算法完整C++实现
算法
2501_9269783341 分钟前
从“数字果蝇” 到“数字意识”以及AGI的构建思路
大数据·人工智能·经验分享·算法·ai写作·agi
炸膛坦客42 分钟前
单片机/C语言八股:(七)C 程序运行时内存布局的动态变化
c语言·开发语言
无尽的罚坐人生1 小时前
hot 100 101. 对称二叉树
数据结构·算法·leetcode
ZCollapsar.1 小时前
C++从入门到入土 (5):.C/C++内存管理
c语言·c++·学习
一叶落4381 小时前
【LeetCode】1. 两数之和(Two Sum)— 哈希表经典题解(C语言)
数据结构·c++·算法·leetcode