响应号召做掘金的每日好题3.2.2|刷题打卡

156 阅读2分钟

一、题目描述:

二、思路分析:

这是一道双指针题,但不是一道滑动窗口题,所以比较简单。

简单的双指针一般分为快慢指针和左右指针

前者解决主要解决链表中的问题,⽐如典型的判定链表中是否包含环;后者 主要解决数组(或者字符串)中的问题,⽐如⼆分查找。

快慢指针⼀般都初始化指向链表的头结点 head,前进时快指针 fast 在前, 慢指针 slow 在后,巧妙解决⼀些链表中的问题。

左右指针在数组中实际是指两个索引值,⼀般初始化为 left = 0, right = nums.length - 1 。

这里稍微提一下,有兴趣可以自行了解。

那么这次显然是左右指针,那么左右指针如何移动,就是本题的重点了

首先水的面积由两个变量求得,左右指针的距离,和左右指针的最小值。

因此我们肯定要尽可能的让左右指针距离尽可能大,左右指针的最小值尽可能大

前者需要我们实现左右指针一个从头开始,一个从尾开始。

后者需要我们在移动指针时,优先移动nums[k]小的指针。

三、AC 代码:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int l = 0, r = height.size() - 1;
        int ans = 0;
        while (l < r) {
            int area = min(height[l], height[r]) * (r - l);
            ans = max(ans, area);
            if (height[l] <= height[r]) {
                ++l;
            }
            else {
                --r;
            }
        }
        return ans;

    }
};

四、总结:

双指针的正确性证明一直是一个很有意思的部分,就本题而言

如果我们移动较长指针,那么后续指针的nums值无论多大,计算水的面积都与其无关,反而由于距离的不断减小,导致与最优解失之交臂。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情