一开始我写了个两层循环的程序,没想到居然超时了,有个样本居然是一个15000到1的数组,所以O(n^2)还不够
然后网上看了个提示,才想到O(n)的算法
主要思想:从最两边组成的桶开始计算,如果还有更优解,那更优解的边就是这个桶的子集,且一定有一边比当前最短 边长,这时只需要从这个桶比较短的那边开始向中间遍历(桶的容积取决与短的那一边),这样就变成了跟前面一样的一个子问题,直到这个桶的两边重合为止。
这里怕超时,想到个小技巧,如果从短的那边开始遍历,下一个边更短,不需要计算,直接跳过。(实际感觉很鸡肋。。。代码还变丑了,所以这里放精简版)
class Solution {public: int maxArea(vector<int>& height) { int size = height.size(); int max = 0, i = 0, j = size - 1; while(i != j){ int low = height[i] < height[j] ? height[i] : height[j]; if((j - i) * low > max) max = (j - i) * low; if(height[i] < height[j]) i++; else j--; } return max; }};
新闻热点
疑难解答