三角形问题的解决复杂度O(n^3)和O(nlogn)的比较

问题描述:

n条棍子组成一个三角形,使得三角形周少最大。

方法一:

暴力解则算法复杂度为O(n^3)

#include<stdio.h>
const int MAX_N=105
int main()
{
	void min(int &a,int &b);
	int n,i,j,k,sum=0;
	int ans[MAX_N];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&ans[i]);
	}
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			for(k=j+1;k<n;k++)
			{
				min(ans[i],ans[j]);min(ans[i],ans[k]);min(ans[j],ans[k]);
				if(ans[i]+ans[j]>ans[k])
				{
					if(ans[i]+ans[j]+ans[k]>sum)
					sum=ans[i]+ans[j]+ans[k];
				}
			}
		}
	}
	printf("%d
",sum); 
	return 0;
} 
void min(int &a,int &b)
{
	int t;
	if(a>b)
	{
		t=a;a=b;b=t;
	}
}

方法二:

从大到小将棍子排序,然后依次检查棍子是否满足A<B+C的情况,第一次满足的情况即答案,复杂度O(nlogn)

#include<stdio.h>
const int MAX_N=105; 
int main()
{
	int n,i,j,sum=0;
	int ans[MAX_N];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&ans[i]);
	}
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(ans[j]>ans[i])//ans[i]与ans[j]值进行交换 
			{
				ans[j]=ans[j]+ans[i];
				ans[i]=ans[j]-ans[i];
				ans[j]=ans[j]-ans[i];
			}
		}
	}
	for(i=0;i<n-2;i++)
	{
		if(ans[i]<ans[i+1]+ans[i+2])
		{
			sum=ans[i]+ans[i+1]+ans[i+2];
			break;
		} 
	} 
	printf("%d
",sum);
	return 0;
}
原文地址:https://www.cnblogs.com/ZhaoxiCheung/p/5202868.html