给定由一些正数(代表长度)组成的数组 A
,返回由其中三个长度组成的、面积不为零的三角形的最大周长。
如果不能形成任何面积不为零的三角形,返回 0
。
示例 1:
输入:[2,1,2]
输出:5
示例 2:
输入:[1,2,1]
输出:0
示例 3:
输入:[3,2,3,4]
输出:10
示例 4:
输入:[3,6,2,3]
输出:8
提示:
3 <= A.length <= 10000
1 <= A[i] <= 10^6
解析:
该题目是求数组中能组成三角形的最大周长,主要用到三角形两边之和大于第三边的性质。由于数组中数值没有规律性,不容易计算,所以首先对数组进行排序,然后从中找出符合条件的最大数组。我自己写的方法比较繁琐,是从头到尾遍历数组,计算可行性,leetcode中较为简单的做法是从后往前遍历数组,很容易计算。
代码:
int largestPerimeter(vector<int>& A)
{
sort(A.begin(), A.end());
int size = A.size();
int left = 0, mid = 1, right = 2;
int maxLength = 0;
while (right < size)
{
if (A[left] + A[mid] > A[right])
{
maxLength =max(maxLength, A[left] + A[mid] + A[right]);
if (left < mid - 1)
{
left++;
}
else if (mid < right - 1)
{
mid++;
}
else
{
right++;
}
}
else
{
if (left < mid - 1)
{
left++;
}
else if (mid < right - 1)
{
mid++;
}
else
{
left++;
right++;
mid++;
}
}
}
return maxLength;
}
leetcode中代码:
int largestPerimeter(vector<int>& A)
{
int data = 0;
sort(A.begin(),A.end());
for (int i = A.size() - 3; i >= 0; --i) {
if (A[i] + A[i + 1]>A[i + 2]) {
data = A[i+1] + A[i] + A[i + 2];
break;
}
}
return data;
}