竞赛讨论区 > 牛牛与三角形 我的解
头像
风去幽墨12138
编辑于 2020-12-15 21:40
+ 关注

牛牛与三角形 我的解

唉,害得我交了七发都没过。赛后来了个题目有问题。。。。
以下贴出我的代码,不保证复杂度能达到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)的可以看这个哥们的帖子:挺详细的

全部评论

(7) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐