题目地址:
https://leetcode.com/problems/valid-triangle-number/
给定一个非负数组 A [ i ] A[i] A[i],求其有多少个三元组可以组成三角形的三条边。
思路是双指针。如果数组长度小于 3 3 3那直接返回 0 0 0;否则的话将数组从小到大排序,从 A [ i ] A[i] A[i]开始,判断 A [ 0 : i − 1 ] A[0:i-1] A[0:i−1]之间有多少个数对的和是大于 A [ i ] A[i] A[i]的,累加起来即可。代码如下:
import java.util.Arrays;
public class Solution {
public int triangleNumber(int[] nums) {
if (nums.length < 3) {
return 0;
}
Arrays.sort(nums);
int res = 0;
for (int i = 2; i < nums.length; i++) {
int l = 0, r = i - 1;
while (l < r) {
if (nums[l] + nums[r] > nums[i]) {
res += r - l;
r--;
} else {
l++;
}
}
}
return res;
}
}
时间复杂度 O ( n log n ) O(n\log n) O(nlogn),空间 O ( 1 ) O(1) O(1)。