给定一个数组, 每个数值代表柱子的高度, 那么求出这些柱子最多可以装多少水. 水的体积由较短的长度乘以两个柱子的距离.
container-with-most-water-leetcode-puzzle-coding-exercise C++ 编程练习题 - 最多水容器 (递归) ACM题解 程序设计
输入
第一行输入一个数字N表示容器个数。第二行输入N个使用空格间隔的整数,表示容器高度。
输出
输出一个数字表示最多装水量。
样例输入 复制
9
1 8 6 2 5 4 8 3 7
样例输出 复制
49
提示
2 <= N <= 10
引用chatgpt部分指引作答:
运行结果如下:
#include <iostream>
#include <assert.h>
#include <algorithm>
using namespace std;
int a[1000];
int main(void)
{
int n;
cin >> n;
for (int i = 0; i<n; i++)
{
cin >> a[i];
}
int sum = 0;
int l = 0, r = 100 - 1;
while (r>l)
{
int S = min(a[l], a[r]) * (r - l);
sum = max(sum, S);
a[r]>a[l] ? l++ : r--;
}
cout << sum << endl;;
system("pause");
return 0;
}
哈喽你好呀!
我们通过设置两个指针,分别指向数组的头l和尾r,计算容器可以容纳多少水contain。我们知道想要容乃的水最多,最好的情况是l和r都是最大,然后二者离的最远,但是这是理想情况,我们最一般的情况是
二者离的足够远,但是二者都不是很大
二者都很大,但是二者离的近
所以我们一开始从两边考虑就是考虑的第一种可能。如果这个时候num[l] < num[r],我们就需要将l++,因为我们的容量由短板决定,所以我们希望短板更长。如果这个时候num[l] > num[r],我们就需要将r--。而num[l] == num[r],l++或者r--都可以。
#include <iostream>
#include <assert.h>
#include <algorithm>
using namespace std ;
int a[1000] ;
int main(void)
{
int n ;
cin >> n ;
for(int i=0; i<n; i++)
{
cin >> a[i] ;
}
int sum = 0 ;
int l = 0, r = 100-1 ;
while(r>l)
{
int S = min(a[l],a[r]) * (r-l) ;
sum = max(sum, S) ;
a[r]>a[l]?l++:r-- ;
}
cout << sum << endl ; ;
return 0 ;
}
引用chatGPT作答,以下是使用双指针的C++代码实现:
#include <iostream>
#include <vector>
using namespace std;
int maxArea(vector<int>& height) {
int left = 0, right = height.size() - 1;
int maxArea = 0;
while (left < right) {
int area = min(height[left], height[right]) * (right - left);
maxArea = max(maxArea, area);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxArea;
}
int main() {
int n;
cin >> n;
vector<int> height(n);
for (int i = 0; i < n; i++) {
cin >> height[i];
}
int ans = maxArea(height);
cout << ans << endl;
return 0;
}
解释:
首先,定义左右两个指针分别指向数组的第一个和最后一个元素,这两个元素组成了一个容器。容器的面积可以计算出来,然后与当前最大面积比较,更新最大面积。
容器的高度由两个指针指向的元素的最小值决定,容器的宽度由两个指针的距离决定。因为容器的宽度是随着指针的移动而变化的,所以我们每次移动较小的那个指针,这样才有可能让容器的面积增加。
最后返回最大面积即可。
您好,根据你的需求,使用双指针实现代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int max_area(vector<int>& arr) {
int n = arr.size();
int i = 0; // 左指针
int j = n - 1; // 右指针
int max_area = 0; // 最大面积
while (i < j) {
// 计算当前面积
int area = min(arr[i], arr[j]) * (j - i);
// 更新最大面积
max_area = max(max_area, area);
// 移动指针
if (arr[i] < arr[j]) {
i++;
} else {
j--;
}
}
return max_area;
}
int main() {
int n; // 容器个数
cin >> n; // 读取容器个数
vector<int> arr(n); // 创建一个大小为 n 的 vector
for (int i = 0; i < n; i++) {
cin >> arr[i]; // 读取每个容器的高度
}
cout << max_area(arr) << endl; // 调用函数并输出结果
return 0;
}
运行结果
#include <iostream>
using namespace std;
int maxArea(int A[], int len)
{
int area = 0;
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
// Calculating the max area
area = max(area, min(A[j], A[i]) * (j - i));
}
}
return area;
}
// Driver code
int main()
{
int N;
cin>>N;
int *arr = new int[N];
for(int i =0;i<N;i++)
cin>>arr[i];
cout<<maxArea(arr,N)<<endl;
}
```