力扣(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);
}
相关推荐
cynicme20 小时前
力扣3228——将 1 移动到末尾的最大操作次数
算法·leetcode
熬了夜的程序员20 小时前
【LeetCode】109. 有序链表转换二叉搜索树
数据结构·算法·leetcode·链表·职场和发展·深度优先
随意起个昵称20 小时前
【递归】二进制字符串中的第K位
c++·算法
mjhcsp21 小时前
C++ 循环结构:控制程序重复执行的核心机制
开发语言·c++·算法
立志成为大牛的小牛21 小时前
数据结构——四十一、分块查找(索引顺序查找)(王道408)
数据结构·学习·程序人生·考研·算法
xier_ran21 小时前
深度学习:RMSprop 优化算法详解
人工智能·深度学习·算法
地平线开发者21 小时前
不同传感器前中后融合方案简介
算法·自动驾驶
地平线开发者1 天前
征程 6X 常见 kernel panic 问题
算法·自动驾驶
com_4sapi1 天前
2025 权威认证头部矩阵系统全景对比发布 双榜单交叉验证
大数据·c语言·人工智能·算法·矩阵·机器人
前端小L1 天前
二分查找专题(九):“降维”的魔术!将二维矩阵“拉平”为一维
数据结构·算法