三角形问题的解决复杂度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\n",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\n",sum);
    return 0;
}

你可能感兴趣的:(三角形问题的解决复杂度O(n^3)和O(nlogn)的比较)