描述
给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。
示例 1:
输入: nums = [2,2,3,4]
输出: 3
解释:有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
示例 2:
输入: nums = [4,2,3,4]
输出: 4
提示:
1 <= nums.length <= 1000
0 <= nums[i] <= 1000
通过次数70,409提交次数131,303
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-triangle-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
有效三角的判断公式:a+b>c (a,b小于等于c)
双指针解法:
固定最大值,然后双指针遍历固定最大值的左侧区域。(不可以固定最小值,双指针遍历右侧区域,这样行不通)
若nums[j]+ nums[k] > nums[i]则 j+1~k-1之间的值都是满足条件的,直接加入到结果。
若nums[j]+ nums[k] <= nums[i] 则一直增加j。
一直缩小k直到j与k相遇
class Solution {
public int triangleNumber(int[] nums) {
Arrays.sort(nums);
int ans = 0;
for (int i = nums.length - 1; i >= 2; i--) {
int j = 0;
int k = i-1;
while (j < k) {
while (j < k && nums[j]+ nums[k] <= nums[i]) {
j++;
}
if (j != k) {
ans += k - j;
}
k--;
}
}
return ans;
}
}