Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ภาชนะที่จุน้ำได้มากที่สุด (Container with Most Water) ใน C++


เราได้รับอาเรย์ความสูงของกำแพงภาชนะ เป้าหมายคือหาภาชนะที่จุน้ำได้มากที่สุด (ปริมาตรสูงสุด) ความสูงของน้ำถูกจำกัดโดยกำแพงที่ต่ำกว่า หาก Arr[i] < Arr[j] ความสูงน้ำ = Arr[i] ความกว้าง = j - i ดังนั้นพื้นที่ = Arr[i] * (j - i) ต้องหาพื้นที่สูงสุด

อินพุต

Arr[] = {5, 1, 2, 3, 5}

เอาต์พุต

Maximum water area: 20

คำอธิบาย − ตามรูป กำแพงความสูง 5,1,2,3 ความกว้างสูงสุดระหว่างกำแพง

Arr[0] และ Arr[4] width=4, area = 5*4=20
Arr[1] และ Arr[4] width=3, area = 1*3=3
Arr[2] และ Arr[0] หรือ Arr[4] width=2, area = 2*2=4
Arr[3] และ Arr[0] width=3, area = 3*3=9
Arr[4] และ Arr[0] width=4, area = 5*4=20

ภาชนะจุน้ำมากที่สุด area=20 กำแพง Arr[0] และ Arr[4]

อินพุต

Arr[] = {1, 5, 4, 3, 2, 4}

เอาต์พุต

Maximum water area: 16

คำอธิบาย − พื้นที่สูงสุด 16 ที่กำแพง Arr[1] และ Arr[5] (ความสูง 4 และ 4, ความกว้าง 4)

วิธีการที่ใช้ในโปรแกรมด้านล่าง

  • อาเรย์ walls[] เก็บความสูงกำแพง
  • ฟังก์ชัน mostwater(int A[], int len) คืนค่าพื้นที่สูงสุด
  • ใช้ two pointers: l=0 (ซ้าย), r=len-1 (ขวา)
  • ตัวแปร area, maxarea เก็บพื้นที่ปัจจุบันและสูงสุด
  • minwall, lwall, rwall เก็บความสูงต่ำสุด, ซ้าย, ขวา
  • while (l < r) คำนวณพื้นที่ = minwall * (r - l) อัปเดต maxarea
  • ย้าย pointer ที่ความสูงต่ำกว่าเข้ามา (l++ หรือ r--)
  • คืนค่า maxarea

ตัวอย่างโค้ด

#include <iostream>
using namespace std;

int mostwater(int A[], int len) {
    int r = len - 1;
    int l = 0;
    int area = 0, maxarea = 0;
    int minwall, lwall, rwall;
    while (l < r) {
        lwall = A[l];
        rwall = A[r];
        minwall = (lwall <= rwall) ? lwall : rwall;
        area = minwall * (r - l);
        maxarea = (area >= maxarea) ? area : maxarea;
        if (lwall <= rwall)
            l++;
        else
            r--;
    }
    return maxarea;
}

int main() {
    int walls[] = {1, 5, 4, 3, 2, 4};
    int num = sizeof(walls) / sizeof(walls[0]);
    cout << endl << "Container with Most water has area: " << mostwater(walls, num);
    return 0;
}

ผลลัพธ์

Container with Most water has area: 16