题目:盛最多水的容器
如果直接用两个for循环遍历所有容积情况,时间复杂度是O(n^2),会超时…..
所有需要使用正确的算法
那么这题使用的就是双指针的方法。
首先分析思路:虽然说是双指针,但实际上使用的是两个索引的方法–定义left=0(最左边),right=数组大小-1(最右边),然后计算出初始的容积大小
我们发现,移动长板(向里走,也就是将索引向里挪一位)会使水槽的宽度会变窄,即使移动过后得到的板子是更长的板子,容积仍然会变小,更短的板子同理(短板效应);但是如果移动的是短板,假如下一块板子是更长的,那么就有可能会使容积变大(e.g.第一块板子长为1,最后一块板子长为7,一共九块板子,那么此时容积就是(1x8)=8,接下俩移动短板,第二块板子长为8,此时容积为(7x7)=49,容积变大了)
所以,只需要找到两块板子中更短的那块,固定住长板,只移动短板就行
1
2int maxArea(vector<int>& height)
3
4 {
5
6 int left = 0, right = static_cast<int>(height.size()) - 1;
7
8 int volumn = std::min(height[left],height[right]) * right;
9
10 while(left < right)
11
12 {
13
14 if(height[left] < height[right])
15
16 {
17
18 left++;
19
20 }
21
22 else
23
24 {
25
26 right--;
27
28 }
29
30 volumn = std::max(volumn, (std::min(height[left],height[right]) * (right - left)));
31
32 }
33
34 return volumn;
35
36 }