1. 题目描述
难度:中等
2. 题目分析
该题目数字化之后可以这么理解:
给定数据[(a1,1), (a2,2), (a3,3)…(an, n)], 求解 min(ax, ay)*abs(x-y)的最大值。该题目有两种解法:
- 暴力穷举法
该方法是最容易想到的,依次穷举所有情况,然后输出最大值即可,这种算法时间复杂度为O(n^2) - 双指针法
双指针法在处理数组问题的时候真的是神器,定义两个指针,一个放在数组首位,一个放在数组末尾,然后计算对应的面积,将两者之间高度小的一方移动,并更新面积的值,直到两个指针相遇输出最终的结果。至于这个方法为什么一定能够遇到最大值,我还没有想明白,只是可以从反证的角度来解释。这种算法时间复杂度为O(n)
3. C语言实现
3.1 暴力穷举法
代码如下:
int maxArea(int* height, int heightSize){
int i, j, h, l;
long res = 0;
for(i = 0; i < heightSize-1; i++){
for(j = i+1; j < heightSize; j++){
h = height[i]>height[j]? height[j]:height[i];
l = j-i;
res = res>h*l? res:h*l;
}
}
return res;
}
运行结果为:
3.2 双指针法
代码如下:
int maxArea(int* height, int heightSize){
//i, j为两个指针,h为高,l为长,用来计算面积
int i=0, j=heightSize-1, h, l;
long res = 0;
for(;i<j;){
h = height[i]>height[j]?height[j]:height[i];
l = j-i;
res = res>l*h?res:l*h;
if(h==height[i])
i++;
else
j--;
}
return res;
}
运行结果为: