力扣(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);
}
相关推荐
洛水水3 分钟前
【力扣100题】30.二叉树的直径
算法·leetcode·职场和发展
gihigo19981 小时前
Bezier曲线曲面生成算法
算法
平行侠2 小时前
024多精度大整数 - 突破硬件精度限制的任意精度运算
数据结构·算法
谙弆悕博士2 小时前
快速学C语言——第16章:预处理
c语言·开发语言·chrome·笔记·创业创新·预处理·业界资讯
matlabgoodboy2 小时前
软件开发定制小程序APP帮代做java代码代编写C语言设计python编程
java·c语言·小程序
IronMurphy2 小时前
【算法四十五】139. 单词拆分
算法
洛水水3 小时前
【力扣100题】32.将有序数组转换为二叉搜索树
数据结构·算法·leetcode
handler013 小时前
UDP协议与网络通信知识点
c语言·网络·c++·笔记·网络协议·udp
如竟没有火炬3 小时前
用队列实现栈
开发语言·数据结构·python·算法·leetcode·深度优先
C+++Python4 小时前
C 语言 动态内存分配:malloc /calloc/realloc /free
c语言·开发语言