力扣(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);
}
相关推荐
努力学习编程的伍大侠11 分钟前
基础排序算法
数据结构·c++·算法
XiaoLeisj39 分钟前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
Jasmine_llq1 小时前
《 火星人 》
算法·青少年编程·c#
闻缺陷则喜何志丹1 小时前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
Lenyiin1 小时前
01.02、判定是否互为字符重排
算法·leetcode
小林熬夜学编程2 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
鸽鸽程序猿2 小时前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd2 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo6172 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript