力扣刷题之旅--011盛最多水的容器

粗略学了一些数据结构之后,觉得学得并不深,就上力扣找题目来加强每一方面的知识点的训练了,也是刚开始刷题的,听闻大佬说要想在数据结构与算法这方面有所进步,就每天精写题目,并写写做题笔记,于是就上来CSDN上写写自己分做题记录了哈。

题目描述:

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
输入实例: [1,8,6,2,5,4,8,3,7]
输出:49

C语言解法

方法一:直接暴力求解,即是用两个循环来求解,我刚开始就是用这种方法算的,时间复杂度为O(n^2),很高,第一次提交的时候运行时间太长,提交失败哈。然后改了一些条件的判断的语句,虽然相对减少了一些执行时间,但是时间复杂度还是平方阶。没有本质上的改变。(以下是自己写的提交成功的代码):

int maxArea(int* height, int heightSize){
    int MaxArea;                //定义最大的体积
    int tempArea;               //体积的中间变量
    int bacis;                  //差值
    //提前假定最大值
    if(height[0] > height[1])
        MaxArea = height[1];
    else if(height[0] < height[1])
        MaxArea = height[0];
    else
        MaxArea = height[1];
    for(int i = 0;i < heightSize;i++)
    {
        for(int j = i + 1;j < heightSize;j++)
        {
            bacis = j - i;
           if((height[i] > height[j]) || (height[i] == height[j]))
                tempArea = height[j] * bacis;
           else
                tempArea = height[i] * bacis;
            if(tempArea > MaxArea)
                MaxArea = tempArea;
        }
        
    }
    
    return MaxArea;
    
}

执行时间很高:为1764ms.
这么高的,于是就去看了一下官方给的答案的解法,官方是用双指针法的(学习到了),然后就学习了官方的方法了。
方法二:使用双指针,分别指向数组两端,计算成绩大小,然后较小的那端进行移动,往大的那边移动,看能不能找到更大是数据,此时虽然底的长度会下降,但是可以找到更大的长度的话也是可取的。以下是代码实现:

nt maxArea(int* height, int heightSize){
    int MaxArea;                
    int tempArea;             
    int bacis;                
    int low = 0,high = heightSize - 1;
    
    bacis = high - low;
    if((height[low] > height[high]) || (height[low] == height[high]))
        MaxArea = height[high] * bacis;
    else
        MaxArea = height[low] * bacis;
    
    for(int i = 1;i < heightSize - 1;i++)
    {
        if(height[high] > height[low])
            ++low;
        else
            --high;
        bacis = high - low;
        if((height[low] > height[high]) || (height[low] == height[high]))
             tempArea = height[high] * bacis;
         else
             tempArea = height[low] * bacis;
        if(tempArea > MaxArea)
            MaxArea = tempArea;
        
    }
    
    return MaxArea;

这个是时间复杂度只有O(n),因此快了很多,执行时间为20ms。真的是不能比的哈,数组题目里面的双指针法好像经常被用到!学习GET!

猜你喜欢

转载自blog.csdn.net/weixin_44184990/article/details/101201378