题干如上
看见题的第一时间想到先排序
排序完,思考三角形的性质,两边之和大于第三边,两边之差小于第三边
事实上,任意三条边只需满足两条小边之和 大于 最大边,三条边就可以组成三角形
代码如下
因为是从大到小遍历,所以当出现满足条件的一组数时,最内层循环可以直接跳出
然后想算法优化
最内层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--更不可能满足
再往下优化,就是这样。。。。。。。。
显然,意义不大。。。。。。。。。。
就这样,散会!