C++最多水容器,和蓝桥杯的不同

给定一个数组, 每个数值代表柱子的高度, 那么求出这些柱子最多可以装多少水. 水的体积由较短的长度乘以两个柱子的距离.
container-with-most-water-leetcode-puzzle-coding-exercise C++ 编程练习题 - 最多水容器 (递归) ACM题解 程序设计

img

输入
第一行输入一个数字N表示容器个数。第二行输入N个使用空格间隔的整数,表示容器高度。
输出
输出一个数字表示最多装水量。
样例输入 复制
9
1 8 6 2 5 4 8 3 7
样例输出 复制
49
提示
2 <= N <= 10

引用chatgpt部分指引作答:
运行结果如下:

img


#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;
}

运行结果

img

#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;
   
}

```