2021-08-04 LeetCode每日一题
链接:https://leetcode-cn.com/problems/valid-triangle-number/
标签:数组、排序、二分、双指针
题目
给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
示例 1:
输入: [2,2,3,4]
输出: 3
解释:
有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
注意:
- 数组长度不超过1000。
- 数组里整数的范围为 [0, 1000]。
分析
方法1:排序后使用暴力破解,3层循环,但在求解过程中判断一些特殊情况提前结束,也可以AC。复杂度O(n ^ n)
方法2:排序后,可以固定最大值,然后剩下的两个数分别使用两个指针指向除最大值外的最大和最小值,移动判断,复杂度O(n ^ n)
编码
方法1:
class Solution {
public int triangleNumber(int[] nums) {
Arrays.sort(nums);
int res = 0, len = nums.length;
for (int i = 0; i < len - 2; i++) {
if (nums[i] == 0) {
continue;
}
for (int j = i + 1; j < len - 1; j++) {
for (int k = j + 1; k < len; k++) {
if (nums[i] + nums[j] > nums[k]) {
res++;
} else {
// 不可能大于后面的了
break;
}
}
}
}
return res;
}
}
方法2:
class Solution {
public int triangleNumber(int[] nums) {
Arrays.sort(nums);
int res = 0, len = nums.length;
for (int i = len - 1; i >= 2; i--) {
int left = 0, right = i - 1;
while (left < right) {
// 说明[left, right]之间的数两两都符合条件
if (nums[left] + nums[right] > nums[i]) {
// 这相当于是固定right了,移动left,总共有right - left种组合
res += (right - left);
// 移动righ
right--;
} else {
left++;
}
}
}
return res;
}
}