给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
示例:
输入: [2,2,3,4]
输出: 3
解释:
有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
思路1:
判断能否构成三角形的基础办法是任意两边之和大于第三条边,那么暴力的去解决就得选取两条边,再选取第三条边进行比较,时间复杂度O(n^3),复杂度有点高。
思路2:
现在想想优化方案,一个简单的思路是先对原数组排序,时间复杂度O(nlogn),并不影响思路一的时间复杂度,好,现在我们有了一个排好序的数组,那现在有什么优势呢,比如说我们依旧先取两条边,现在从后往前遍历,找到满足先前找出的两条边之和大于第三条边时暂停,这时该边和该边之前的全不满足,该边之后全不满足。然而这样数据差的时候依旧不能逃过O(n^3)的悲惨命运
思路3:
O(n3)复杂度太高了,那能不能O(n2)呢。之前我们的思路都是先选取两条边,这样就已经O(n^2)了,貌似已经不行了。。。那能不能先取一条边呢?仔细想想,好像是可以的。这一条边可以取那个所谓的第三条边,然后找前两条边,此时我们假设第三条(最长边)的数组下标为k,这个时候前两条边的下标范围为0到n-1,现在起开始维护两个指针,第一个指针p指向0,第二个指针q指向n-1,这两个指针位置对