给定一个包含非负整数的数组 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
用三层for 循环
枚举出所有的三元组,根据两边之和大于第三边。
class Solution {
public int triangleNumber(int[] nums) {
Arrays.sort(nums);
int n = nums.length, ret = 0;
for(int i = 0; i < n; i++)
for(int j = i + 1; j < n; j++)
for(int k = j + 1; k < n; k++)
if(nums[i] + nums[j] > nums[k])
ret++;
return ret;
}
}
class Solution {
public:
int triangleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size(), ret = 0;
for(int i = 0; i < n; i++)
for(int j = i + 1; j < n; j++)
for(int k = j + 1; k < n; k ++)
if(nums[i] + nums[j] > nums[k])
ret++;
return ret;
}
};
暴力这东西就是悬啊~
那么下面我们讲讲双指针算法
用文字简而言之来说就是:
O(n)
class Solution {
public int triangleNumber(int[] nums) {
// 先对数组进行排序
Arrays.sort(nums);
// 利用双指针解决问题
int ret = 0, n = nums.length;
for(int i = n - 1; i >= 2; i--)
{
int left = 0, right = i - 1;
while(left < right)
{
if(nums[left] + nums[right] > nums[i])
{
ret += right - left;
right--;
}
else
{
left++;
}
}
}
return ret;
}
}
class Solution {
public:
int triangleNumber(vector<int>& nums) {
int ret = 0, n = nums.size();
// 先排序
sort(nums.begin(), nums.end());
// 双指针算法
for(int i = n - 1; i >= 2; i--)
{
int left = 0, right = i - 1;
while(left < right)
{
if(nums[left] + nums[right] > nums[i])
{
ret += right - left;
right--;
}
else
{
left++;
}
}
}
return ret;
}
};