算法原理:
我们可以先对数组排升序排列,之后会利用 “当两条较短的边相加大于第三条边时也能判定它是一个三角形”。然后我们定义一个标志位 pos 指向数组的最后,该标志位其实是代指了三角形的最大的那个边,然后定义两个指针分别表示另两条较小的边,一个指向数组最前,一个指向pos -1 ,然后判断如果此时nums[left]+nums[right] > nums[pos] 此时一定能构成三角形。我们知道数组是升序排列的,如果此时将left++ 一定能构成三角形,因此right~left这一段都能和pos构成三角形,ret+=right-left 。如果此时将right-- 那就不一定能构成三角形了,此时我们需要重复上面的歩奏进行判断,筛选。
代码实现:
class Solution {
public int triangleNumber(int[] nums) {
Arrays.sort(nums);
int ret = 0;
for(int pos =nums.length -1;pos>=2;pos--){
int left =0;
int right = pos - 1;
while(left<right){
if(nums[left] +nums[right] > nums[pos]){
ret+=right - left;
right--;
}else{
left++;
}
}
}
return ret;
}
}