牛牛与三角形 我的解
唉,害得我交了七发都没过。赛后来了个题目有问题。。。。
以下贴出我的代码,不保证复杂度能达到O(nlogn),但绝对达不到O(n2)。
方法:
最大三角形:
找出最大的i满足:a[i]<a[i-1]+a[i-2] (i 属于[2,n-1]) 最大值就是三边之和(可以用俩变量去记避免溢出,例如代码中的mx、mxmx)
最小三角形:
先找到最小的i满足:a[i]<a[i-1]+a[i-2] (i 属于[2,n-1]),然后遍历去找符合条件的最小三角形。
遍历找的时候:a[j]从小找,a[k]从大找,找到满足条件且(a[j]+a[k])最小。过程中可以有点合理剪枝即可通过。
赛时提交的代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回在所有合法的三角形的组成中,最大的三角形的周长减去最小的三角形的周长的值
* @param n int整型 代表题目中的n
* @param a int整型vector 代表n个数的大小
* @return int整型
*/
int solve(int n, vector<int>& a) {
// write code here
sort(a.begin(),a.end());
int mi = 2e9+7,mimx;
for(int i=2;i<n;++i)
{
if(a[i]<a[i-1]+a[i-2])
{
mimx = a[i];
for(int j =0;j<i-1;j++)
{
for(int k=i-1;k>=j+1;--k)
{
if(a[j]+a[k]>mi)
break;
if(a[i]<a[j]+a[k])
mi=min(mi,a[j]+a[k]);
if(a[j]+a[k]<=a[i])
break;
}
}
break;
}
}
int mx = 0,mxmx;
for(int i=n-1;i>=2;--i)
{
if(a[i]<a[i-1]+a[i-2])
{
mxmx = a[i];
mx = a[i-1]+a[i-2];
break;
}
}
return (int)(mx+mxmx-mi-mimx);
}
}; 若有问题,欢迎指出! 复杂度达到O(NlogN)的可以看这个哥们的帖子:挺详细的
