目录
一:题目链接
二:题目思路
三:代码实现
一:题目链接
题目的要求是找出当前数组能组成三角形三元组的个数。
二:题目思路
有一种暴力枚举解法,利用三层 for 循环来一一枚举三元组的情况,如图:
这种解法的时间复杂度已经达到 o(n^3) ,会超时,这不是最优的解法。
有另一种解法,利用数组的单调性配合双指针的算法思想。
首先,先把数组从小到大排个序,然后,先固定该数组中最大的元素(如上图中的 n ),定义两个指针,一个指向数组起始下标,另一个指向该数组中最大的元素上一位的下标,现在有两种情况。
如果当前的 left 和 right 的元素加起来比 n 大,证明该组合的三元组是可以构建三角形的,并且也侧向说明 如果 left 往右边遍历数组再和 right(不动)下标元素加起来也肯定 比 n 大,所以,期间的这种情况有 right - left 种,就不需要一次次遍历判断了,再 right--,进入下一次判断。
如果 当前的 left 和 right 的元素加起来比 n 小,证明该组合的三元组不能构建三角形,并且也侧向说明 如果 right 往左边遍历数组再和 left(不动)下标元素加起来也肯定 比 n 小,就不需要一次次遍历判断了,直接 left++,进入下一次判断。
以上这样,我们就完成了一个当前数组最大的数的判断,以此不断往上循环这个过程。
三:代码实现
//排序数组Arrays.sort(nums);//计数器int sum = 0;//先固定最大的数for(int i = nums.length - 1;i > 1;i--) {int left = 0;int right = i - 1;while(left < right) {if(nums[left] + nums[right] > nums[i]) {sum += right - left;right--;}else {left++;}}}return sum;