《挑战程序新设计竞赛》第二题三角形o(nlogn)

 

题干如上

看见题的第一时间想到先排序

排序完,思考三角形的性质,两边之和大于第三边,两边之差小于第三边

事实上,任意三条边只需满足两条小边之和   大于  最大边,三条边就可以组成三角形

代码如下

因为是从大到小遍历,所以当出现满足条件的一组数时,最内层循环可以直接跳出

然后想算法优化

最内层break跳出的原因是往后的k不满足最大周长和条件

当i , j k 满足组成三角形条件后,即使存在y=k-x满足条件,i+j+k>i+j+y ,即不满足最大周长合的条件

同样的思路,可不可以在第二个循环,最外层循环中使用,用来加上限制条件,

也就是不管是否满足三角形条件,如果当前最大的三数之和小于目前最大周长和,那么跳出

这时候的时间复杂度实际已经近似达到了nlogn,但是不稳定(可能有人说三个for怎么可能nlogn,往后看,别着急)

但是!!!!!

在部分极端条件下,时间复杂度达到了n3

因为我并没有完全看懂这道题,或者说,我的思路在中间就有点歪

回到最内层的break跳出原因,简单描述就是

x<k<j<i ,当i,j , k,满足条件后, 不存在x满足条件

反证就是

若x,j,i满足条件 ,则 i,j,k 也满足条件

延申一下,

有a<b<c<d<e<f; 当选了最大边f,最有可能的两条小边就是相邻的d和e,

因为如果选了a和b,或a和c等等 可以组成三角形,那么有d+e>a+b>f,即d和e一定可以组成更优解,所以从后往前选取相邻的三条即可,找到满足三角形条件的即是最大的,按这个思路的代码就是

写道这里有一种浪费生命的感觉哈哈哈

因为我实在太蠢了而且语言表达能力不足。。。。。。。。

最后还是刨析一下为什么第二个代码不稳定,因为我没有考虑到   如果i,j,k不满足i<k+j,那么k--和j--更不可能满足

再往下优化,就是这样。。。。。。。。

显然,意义不大。。。。。。。。。。

就这样,散会!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值