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