LeetCode Top 100高频算法题,即LeetCode上最高频的100道求职面试算法题。小编和实验室同学之前面试找工作,也只刷了剑指offer和这top 100算法题,在实际面试中也遇到了很多LeetCode上的原题。剑指offer算法最优解之前和大家分享了,LeetCode Top 100这100道算法题,每道题小编都刷了很多遍,并且总结了一种最适合面试时手撕算法的最优解法。后续每天和大家分享一道LeetCode top 100高频算法题,以及小编总结的最优解法。
0. 算法题顺序
LeetCode Top 100 高频算法题系列的LeetCode算法题目就不帮大家翻译了,程序员应该需要能看懂。LeetCode算法题有一个技巧:先看每道题的example,大部分情况看完example就能理解题目意思;如果看完example还有疑惑,可以再回过头来看英文题目。这样也可以节省一点时间~
1. 题目描述
Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of the line i is at (i, ai) and (i, 0). Find two lines, which, together with the x-axis forms a container, such that the container contains the most water.
Notice that you may not slant the container.
2. Examples
1th example
Input: height = [1,8,6,2,5,4,8,3,7]
Output: 49
Explanation: The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.
height中的数字对应着一个柱形图:横坐标是height数字的索引值 + 1;高度是height组数中的数字;求的是这些柱形图中最大矩形的面积
2th example
Input: height = [1,1]
Output: 1
3th example
Input: height = [4,3,2,1,4]
Output: 16
4th example
Input: height = [1,2,1]
Output: 2
3. Constraints(输入的数据约束)
n = height.length
2 <= n <= 3 * 104
0 <= height[i] <= 3 * 104
解析
在LeetCode上本题属于Medium难度。这道题也是一道典型的动态规划类型题目,动态规划类型题目非常重要,这类题目也是面试中的常客!!
本题是高频面试题!!!
O(n)解法:
我们从最大的宽度开始搜索即从left=0,right=height.length开始搜索;
由于目前是最大的宽度,而left和right所确定的边界容器高度取决于高度较短的边界(能装多少水取决于短边)
如果我们需要通过移动边界之一来增加容器的容量:由于移动边界会造成容器宽度减小,宽度减小可能会造成容量减小;只有当容器的有效高度增加时,才可能抵消掉由于边界减小造成的容器减小的那部分容量(只有短边增加才能增加容器的有效高度)。
如何增加当前边界决定的容器有效高度?因为容器的有效高度是由较短的那条边决定的,此时移动较高的那条边,对容器的有效高度无影响,所以我们只能移动边界中较短的边界
证明:假设最优解是高度为(a,b)的组合,那么当其中一个边界(假设为left)先到达最优解之一时(a),直到另外一个边界也到达另外一个最优解前,该边界不会再移动。现在证明:当left先到达最优边界高度a,在right到达另外一个最优边界前,left不会移动:
如果在right到达最优边界之前,left移动了,即出现了right指向的高度比a大(因为移动时我们总是移动短边):此时right-a的宽度比b-a宽度更大(因为right出现在b之后,right>b),所以只需要比较高度,而容器有效高度分别为: min(right,a)=a 和min(a,b);
前者为有效高度a,后者:若a>b,则为b, 此时前者有效高度和宽度均大于后者;若a<=b,,后者有效高度为a,与前者相同,但是前者的有效宽度更大,因此(a,right)是更优解,与假设不符。
综上,我们每次移动高度小的边界,2个边界相遇之前一定会有最优解出现!
下面是代码
class Solution {
public int maxArea(int[] height) {
int left = 0;
int right = height.length-1;
int maxCap = 0;
while(leftmaxCap)
maxCap = cap;
//移动边界
if(height[left]<=height[right])
left++;
else
right--;
}
return maxCap;
}
/*
暴力解法:O(n^2)
*/
/*public int maxArea(int[] height) {
int maxCapacity = -1;
for(int i=0;imaxCapacity)
maxCapacity = cap;
}
}
return maxCapacity;
}*/
}
其他文章
- 免费帮忙下载csdn和百度文库资料福利
- 学习笔记和学习资料汇总:前端 + 后端 + java + 大数据 + python + 100多实战项目 + C++
- 我的秋招经历总结:一站式秋招规划
- 零基础学爬虫
- 零基础C++学习总结
欢迎关注个人公众号【菜鸟名企梦】,公众号专注:互联网求职面经、java、python、爬虫、大数据等技术分享:
公众号菜鸟名企梦后台发送“csdn”即可免费领取【csdn】和【百度文库】下载服务;
公众号菜鸟名企梦后台发送“资料”:即可领取5T精品学习资料、java面试考点和java面经总结,以及几十个java、大数据项目,资料很全,你想找的几乎都有