查找数组中是否存在任意三个数可组成三角形的算法

分治法:

先把数组一a[i]为界,分成两部分,左边比a[i]小,右边比a[i]大。

接下来问题就变成了两个子问题,左右两个子数组,再加上一下这三种情况:

1:左面数组去一个数、右面数组取一个数,a[i]三个数判断;

2:左面取两个数与a[i]判断;

3:右面取两个数与a[i]判断;

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

void swap(int *a,int *b){
    int c=*a;
    *a=*b;    
    *b=c;
}
int valid(int a,int b,int c)
{
    return a+b>c && a+c>b && b+c>a;
}
int partion(int * a,int p,int q)//快排
{
    int i,j;
    for(i = p-1,j = p;j<q;++j)
    {
        if(a[j] < a[q] && a[++i]> a[q])//i——j之间的值为大于a[q]的值,i以前的都是比a[q]的值小的值。
            swap(&a[i],&a[j]);
    }
    swap(&a[i+1],&a[q]);
    return i+1;
}
int subtri(int * a,int p,int q)
{
    int mid;
    if(q-p+1 < 3)return 0;
        mid = partion(a,p,q);
    if(subtri(a,p,mid-1)||subtri(a,mid+1,q))return 1;
    else
    {
        int l,r;
        for(l = p;l<mid;l++)
            for(r = mid+1;r <= q;++r)
            {
                if(valid(a[r],a[l],a[mid]))return 1;
            }
        for(l = p;l<mid;l++)
            for(r = p;r<mid;r++)
            {
                if(r != l && valid(a[r],a[l],a[mid]))return 1;
            }
        for(l = mid+1;l<=q;l++)
            for(r = mid+1;r<=1;r++)
            {
                if(r != l && valid(a[r],a[l],a[mid]))return 1;
            }
    }
    return 0;
}
int main()
{
    int a[] = {4,4,1,2,3,5,7,8,9};
    printf("%d",subtri(a,0,8));
    return 0;
}

 

    原文作者:查找算法
    原文地址: https://blog.csdn.net/u011523796/article/details/9529185
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞