题目描述
给定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
解题方法: 双指针 + 贪心比较。
代码
#include <iostream>
#include <vector>
int get_max_water_size(const std::vector<int>& nums) {
int n = nums.size();
int left = 0;
int right = n - 1;
int max_size = 0;
while (left <= right) {
int size = (right - left) * std::min(nums[left], nums[right]);
max_size = std::max(size, max_size);
if (nums[left] <= nums[right]) {
left++;
} else {
right--;
}
}
return max_size;
}
void print_result(const std::vector<int>& input, int output) {
// input
std::cout << "input:";
for (auto value : input) {
std::cout << value << " ";
}
std::cout << std::endl;
// output
std::cout << "output:" << output << std::endl;
}
int main()
{
// case1: nums={1,8,6,2,5,4,8,3,7} ==> 49
auto nums = {1, 8, 6, 2, 5, 4, 8, 3, 7};
auto result = get_max_water_size(nums);
print_result(nums, result);
return 0;
}
代码运行结果如下:
input:1 8 6 2 5 4 8 3 7
output:49