ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【数组】 11. 盛最多水的容器

2021-10-01 18:32:00  阅读:153  来源: 互联网

标签:11 容器 area int height 最多水 思路 刷题 指针


之前立了flag说这个学期要写技术blog,正好今日喜迎国庆,值此佳节,实乃开启撰写技术博客之旅的好时机。同时,我也希望能与广大CSDNer进行技术交流并获得指导。那么,就从第一篇文章开始吧!

刷题思路

首先简单规划一下准备刷力扣的思路,在参考了若干大佬的文章后,我准备按照 数组→链表→二叉树/树→二分查找→BFS/DFS 的顺序进行刷题。每种类型的题目先刷5-10题,对刷题有个初步的了解以后再进行更深入的刷题。

(算法虐我千百遍,我待算法如初恋。希望能享受在算法的海洋里遨游的过程~)

刷题随想

数组专题做的第一道题其实是twoSum,但感觉好像能写的不多,主要就两种思路:

  1. 双重for循环遍历,找到加和符合target的两个数就break。
  2. 运用基于红黑树的map映射(个人将map与python里的字典做类比),通过遍历一遍或两遍hash表实现。

做的第二题是第11题:盛最多水的容器

这道题目实质上是算面积。由于没有任何经验,因此刚开始拿到题目的第一思路就是穷举。后来想了一下,这种方法其实也可以称为双指针(双索引)嘛,只不过两个指针扫描的方向和出发的位置都一毛一样而已:双重for循环,算出所有area,不断更新并记录max area。

但这个算法复杂度就是O(n^{2})了,有点可怕。。。


又想了大概10min,依然想不到什么好的思路,便去看了下题解。当点开官方题解,看到“双指针”三个字,以及简要描述后,我一瞬间感觉被闪电击中,思路一下就被激发了:

设置一左一右两个指针(索引)。因为面积的计算公式是:min(height[l],height[r])*(r-l),因此我们每次移动数组元素值较小(height[l]或height[r])的元素的指针;且移动时,l每次往右移动一位,r往左移动一位。这样能在l和r之间的距离缩小的同时,更新min(height[l],height[r])的值。不断重复这个过程,算出每一个area,并更新记录max area的值。此时,仅需扫描一遍数组即可,时间复杂度降为了O(n)

后来,我发现移动左/右指针的过程与快排中的颇为类似。因此,我又优化了一下代码,把

for(int i=0;i<height.size();i++)

改成了

while(l!=r)

这样,执行时间从76ms降到了60ms,超过了约98%的提交者~

最后,附完整代码如下:

//双指针解法
//T:O(n) S:O(1)
class Solution {
public:
    int maxArea(vector<int>& height) {  
        int l=0,r=height.size()-1;
        int ma=0;
        while(l!=r)
        {
            int tmp=min(height[l],height[r])*(r-l);
            if(tmp>ma) ma=tmp;
            if(height[l]<height[r]) l++;
            else r--;
        }
        return ma;
    }
};

标签:11,容器,area,int,height,最多水,思路,刷题,指针
来源: https://blog.csdn.net/Santi_Problem/article/details/120579105

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有