一、有效三角形的个数 题目描述:
给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
输入:
[2,2,3,4]
输出:
3
有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
算法思路:双指针法
https://leetcode-cn.com/problems/valid-triangle-number/solution/ming-que-tiao-jian-jin-xing-qiu-jie-by-jerring/
首先对数组进行排序。
固定最长的一条边,运用双指针扫描。
(1) 如果 nums[left] + nums[right] > nums[i],同时说明 nums[left + 1] + nums[right] > nums[i], …, nums[right - 1] + nums[right] > nums[i],满足的条件的有 right - left 种,right 左移。
(2) 如果 nums[left] + nums[right] <= nums[i],说明两边之和小了,让更小的一条边扩大,left 右移。
(1)(2)扫描结束,以最后一条边为长边的三角形个数以数出,–i,固定次长边。
class Solution {
public:
int triangleNumber(vector<int>& nums) {
int size=nums.size();
sort(nums.begin(),nums.end());
int res=0;
for(int i=size-1;i>=2;--i)
{
int left=0;
int right=i-1;
while(left<right)
{
if(nums[left]+nums[right]>nums[i])
{
res+=right-left;
--right;
}
else
++left;
}
}
return res;
}
};
二、有效三角形的个数 题目描述:
给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。如果不能形成任何面积不为零的三角形,返回 0。
输入1:
[2,1,2]
输出2:
5
输入1:
[1,2,1]
输出2:
0
算法思路:
首先数组排序,尽可能找到大的三条边,从最后一个元素开始遍历,满足三角形条件则输出。
class Solution {
public:
int largestPerimeter(vector<int>& A) {
int n=A.size();
sort(A.begin(),A.end());
int maxsize=0;
for(int i=n-1;i>=2;--i)
{
if(A[i-1]+A[i-2]>A[i])
{
maxsize=A[i-2]+A[i-1]+A[i];
break;
}
}
return maxsize;
}
};