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循环暴力求解,结果程序运行时间超时。自己想半天没想明白该怎么改,看了官方答案后不禁感叹太妙了。
道阻且长,继续努力吧。

浙公网安备 33010602011771号