题目链接:11. 盛最多水的容器 - 力扣(LeetCode)
解析:
看数量级最差只能是 o(n logn)的方法,一眼排序,排序之后呢,扫描线,想一下有一根平行x轴的线从上往下,y依次降低,每次的面积就是此时的y * 最远能交叉的两条线,
所以排序完之后,就从最后一个数向前遍历,每次都是第i个数 * (i之后最大和最小的两个下标差)
注意:不排序也行,转换一下x和y就好了,那样就是o(n)
class Solution { public:int maxArea(vector<int>& height) {vector<std::pair<int, int> > nums;for (int i = 0; i < height.size(); i++) {nums.emplace_back(std::make_pair(height[i], i));}std::sort(nums.begin(), nums.end(), [](const pair<int, int>& a, const pair<int, int>& b) {return a.first < b.first;});int n = nums.size();int max_index = std::max(nums[n - 1].second, nums[n - 2].second);int min_index = std::min(nums[n - 1].second, nums[n - 2].second);int max_area = nums[n - 2].first * (max_index - min_index);for (int i = n - 3; i >= 0; i--) {min_index = std::min(min_index, nums[i].second);max_index = std::max(max_index, nums[i].second);max_area = std::max(max_area, nums[i].first * (max_index - min_index));}return max_area;} };