题意
给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
示例 1:
输入: [2,2,3,4]
输出: 3
解释:
有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
注意:
数组长度不超过1000。
数组里整数的范围为 [0, 1000]。
解题思路
三角形定理,两条较小边大于第三边
双指针指向两个较小边
找第三边(ps大于两条小边)
具体代码
class Solution {
public int triangleNumber(int[] nums) {
int len = nums.length;
if(len < 3)
return 0;
Arrays.sort(nums);
int res = 0;
for (int i = 0; i < len-2; i++) {
for(int j = i+1; j < len-1; j++)
{
int mid = findTarget(nums, j , nums[i],nums[j]);
res += mid;
}
}
return res;
}
//利用二分法查询到target,target为大于等于numi与numsj的第一个元素
public int findTarget(int[] nums , int start, int numi,int numj){
int left = start+1;int end =nums.length-1;
while (left<=end)
{
int mid = left+(end-left)/2;
if(nums[mid] < numi+numj)
left=mid+1;
else
end = mid-1;
}
if(left >=nums.length ||nums[left] <numi+numj )
return nums.length-start-1;
return left-start-1;
}
}
效果
info
解答成功:
执行耗时:284 ms,击败了27.12% 的Java用户
内存消耗:38.2 MB,击败了30.63% 的Java用户
统计有效三角形组合
本文介绍了一种算法,用于统计给定数组中能构成三角形的三元组数量,并提供了详细的实现步骤及代码示例。
491

被折叠的 条评论
为什么被折叠?



