leetcode11:盛最多水的容器

0x00:问题描述

  对某一维整型数组,取其中两元素,以较小元素作高、以下标之差作底形成一矩形,求矩形最大面积。

  原题:https://leetcode-cn.com/problems/container-with-most-water/

0x01:解题思路

1.暴力解法

  利用双层for循环,穷举所有可能方案(共Cn2种),找出其中最大值,该方法时间复杂度O(n2)。

2.聪明解法

  双指针。初始时两指针分别指向数组一头一尾,随着循环的进行指针往中间靠拢,每进行一次循环,由两指针所指向元素相对大小决定是哪个指针往中间移动一步,即指向元素小的那个指针移动。原因:考虑指向元素大的那个指针向中间移动的情况,此时宽度必-1,而高度必然不大于原高度,所以新矩形面积必不大于原矩形面积,这样最大面积一定无法进一步突破。所以“移动指向元素大的那个指针”实际上在做无意义的事情,白白浪费程序执行时间。

0x02:代码

class Solution {
public:
    int maxArea(vector<int>& height) {
        int maxarea=0;
        int i=0,j=height.size()-1,temp;
        bool flag;
        while(i<j){
            flag=height[i]<height[j];
            if(flag){temp=height[i]*(j-i);    i++;}
            else{temp=height[j]*(j-i);        j--;}
            if(temp>maxarea)    maxarea=temp;
        }
        return maxarea;
    }
};    

 0x03:总结

  第一眼看上去,想都没想直接来了个双层for循环暴力求解,结果程序运行时间超时。自己想半天没想明白该怎么改,看了官方答案后不禁感叹太妙了。

  道阻且长,继续努力吧。

posted @ 2021-03-16 13:01  leuxon  阅读(56)  评论(0)    收藏  举报