给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
示例 1:
输入: [2,2,3,4]
输出: 3
解释:
有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
注意:
数组长度不超过1000。
数组里整数的范围为 [0, 1000]。
思路:题目不难,注意判断三角形是否合法的条件!
class Solution {
public int triangleNumber(int[] nums) {
int ans=0;
int n=nums.length;
Arrays.parallelSort(nums);
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++) {
int l=j+1,r=n-1,q=-1;
int maxs=nums[i]+nums[j];
while(l<=r) {
int mid=(l+r)/2;
if(nums[mid]<maxs) { q=mid;l=mid+1; }
else r=mid-1;
}
if(q!=-1) ans+=q-j;
}
return ans;
}
}
进一步优化,我们可以采用双指针法去掉一个log的复杂度。
class Solution {
public int triangleNumber(int[] nums) {
int ans=0;
int n=nums.length;
Arrays.parallelSort(nums);
for(int i=0;i<n-2;i++) {
for(int j=i+1,k=j+1;j<n-1 && nums[i]!=0;j++) {
while(k<n && nums[i]+nums[j]>nums[k]) k++;
ans+=k-j-1;
}
}
return ans;
}
}