码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode #11 中等题(双指针,理解起来稍微难一点)

时间:2019-10-10 22:32:24      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:一点   size   code   才有   top   mos   帮助   位置   容器   

题目: 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。n >= 2。

题解: 先来了一发n^2的暴力,。。竟然能过

class Solution {
public:
    int maxArea(vector<int>& height) {
        int n = (int)height.size();
        int ans = 0;
        for (int i = 0; i < n; ++i){
            for (int j = i + 1; j < n; ++j){
                int top = height[j] > height[i] ? height[i] : height[j];
                int water = top * (j - i);
                if (water > ans) ans = water;
            }
        }
        return ans;
    }
};

然后思考了一下在left = 0和right = n-1的位置放一个指针,两边位置小的指针向中间移动,一直到left = right,记录移动过程中的最大值就是答案。

Q:为什么这样就不会错过最大值的区间?

A:策略其实就是贪心的策略,移动高的一侧对结果不可能会有帮助,只有移动低的一侧才有可能使结果变大,最大值区间会在移动过程中遇到。有点说不明白,可以去看官方题解,里面有清楚的证明过程:https://leetcode-cn.com/problems/container-with-most-water/solution/container-with-most-water-shuang-zhi-zhen-fa-yi-do/

class Solution {
public:
    #define Min(a,b) (a > b ? b : a)
    #define Max(a,b) (a > b ? a : b)
    int maxArea(vector<int>& height) {
        int n = (int)height.size();
        int ans = Min(height[0], height[n - 1]) * (n - 1);
        int left = 0, right = n - 1;
        while(left < right) {
            if (height[left] < height[right]) left ++;
            else right --;
            ans = Max(ans, (Min(height[left], height[right])) * (right - left));
        }
        return ans;
    }
};

 

LeetCode #11 中等题(双指针,理解起来稍微难一点)

标签:一点   size   code   才有   top   mos   帮助   位置   容器   

原文地址:https://www.cnblogs.com/error408/p/11650777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!