题目描述:
示例 1:
题目分析:
- 要组成三角形,则需要满足两边之和大于第三边,也就是作为三角形3边的三个元素,任意两个之和,必须大于第三个元素 。
思路一:
代码实现
class Solution {
public int result = 0;
public int triangleNumber(int[] nums) {
Arrays.sort(nums);
int len = nums.length - 1;
for (int i = 0; i <= len - 2; i++) {
for (int j = i + 1; j <= len - 1; j++) {
sum(nums, i, j, len);
}
}
return result;
}
public void sum(int[] nums, int i, int j, int len) {
int q = j + 1;
while (q <= len && nums[i] + nums[j] > nums[q]) {
q++;
result++;
}
}
}
思路二:
代码实现:
class Solution {
public int result = 0;
public int triangleNumber(int[] nums) {
Arrays.sort(nums);
int len = nums.length - 1;
for (int i = 0; i <= len - 2; i++) {
for (int j = i + 1; j <= len - 1; j++) {
sum(nums, i, j, len);
}
}
return result;
}
public void sum(int[] nums, int i, int j, int len) {
int q = j + 1;
int left = q, right = len, index = j;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] < nums[i] + nums[j]) {
index = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
result += index - j;
}
}
思路三
代码实现:
class Solution {
public int result = 0;
public int triangleNumber(int[] nums) {
Arrays.sort(nums);
int len = nums.length - 1;
for (int i = 0; i <= len - 2; i++) {
int q = i + 1;
for (int j = i + 1; j <= len - 1; j++) {
while ((q + 1) <= len && nums[i] + nums[j] > nums[q + 1]) {
q++;
}
q = q > j ? q : j; // 防止一个满足条件的都没有
result += q - j;
}
}
return result;
}
}