分治法:
先把数组一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;
}