LeetCode--11.盛最多的水(双指针,暴力)

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;
}

运行结果为:
在这里插入图片描述

发布了163 篇原创文章 · 获赞 188 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42580947/article/details/104611856