No.2(4)——双指针解决柱子间最大面积

已知现在有几根柱子成有序排列,求出两根柱子之间围成面积的最大值。

No.2(4)——双指针解决柱子间最大面积_第1张图片

         不难想到,只需要将每两个柱子之间的面积计算一次并找出最大值,即可找到答案,但采用双指针法可以有效降低重复计算:从数组的两侧开始移动左右两个指针,首先计算当前面积,由于面积由两根柱子之间的短者决定,因此不难想出:下次移动较长的柱子所对应的指针是没有意义的,故我们应该移动较短侧的指针,如果移动后值变大则更新最大值,否则继续向前移动,直至两指针相遇——通过此种方法的复杂度为o(n)。

实现的代码如下:

#include 
#include 
using namespace std;
 
int main(int argc, char** argv) {
	int num=0;
	vector V;
	cout<<"请输入柱子的个数:"<>num;
	for(int i=1;i<=num;i++)
	{
		int temp=0;
		cin>>temp;
		V.push_back(temp);
	}
	cout<<"用户读入的数据为:"; 
	for(vector::iterator it=V.begin();it!=V.end();it++)
		cout<<(*it)<<" ";
	cout<V[it2])
		{
			cout<<"左指针更大一些"<max)
				max=maxt;
			cout<<"本次操作的面积为:"<V[it1])
		{
			cout<<"右指针更大一些"<max)
				max=maxt;
			cout<<"本次操作的面积为:"<

No.2(4)——双指针解决柱子间最大面积_第2张图片

 通过手算不难发现上述用例结果为6。

No.2(4)——双指针解决柱子间最大面积_第3张图片

第二个用例,手算结果为12。

No.2(4)——双指针解决柱子间最大面积_第4张图片

最后再来一个更长的用例,手算结果为42。

No.2(4)——双指针解决柱子间最大面积_第5张图片 

 此处发现了一个bug:就是源代码未考虑两个指针相等的情况。此处规定:当两指针相等时,对比两指针靠内侧的的下一位大小,如果左边大就移动左边,反之则右边,如果还相同则可以任选。

具体代码如下:

else if(V[it1]==V[it2])
		{
			cout<<"两个指针一样大"<max)
				max=maxt;
			cout<<"本次操作的面积为:"<V[it2-1])
				it1++;
			else if(V[it1+1]<=V[it2-1])
				it2--;
			//判断两侧的下一位谁大,谁大移动谁
			//对于下一位还相同的情况,则可以任选一侧,此处选的是右侧 
		}

No.2(4)——双指针解决柱子间最大面积_第6张图片

 结果与预期一致。

你可能感兴趣的:(C++算法,算法,c++)