题目描述
给你一个下标从 0 开始长度为 3
的整数数组 nums
,需要用它们来构造三角形。
- 如果一个三角形的所有边长度相等,那么这个三角形称为 equilateral。
- 如果一个三角形恰好有两条边长度相等,那么这个三角形称为 isosceles。
- 如果一个三角形三条边的长度互不相同,那么这个三角形称为 scalene。
如果这个数组无法构成一个三角形,请你返回字符串 "none"
,否则返回一个字符串表示这个三角形的类型。
样例
输入:nums = [3,3,3]
输出:"equilateral"
解释:由于三条边长度相等,所以可以构成一个等边三角形,返回 "equilateral"。
输入:nums = [3,4,5]
输出:"scalene"
解释:
nums[0] + nums[1] = 3 + 4 = 7,大于 nums[2] = 5。
nums[0] + nums[2] = 3 + 5 = 8,大于 nums[1] = 4。
nums[1] + nums[2] = 4 + 5 = 9,大于 nums[0] = 3。
由于任意两边纸盒都大于第三边,所以可以构成一个三角形。
因为三条边的长度互不相等,所以返回 "scalene"。
限制
nums.length == 3
1 <= nums[i] <= 100
算法
(分类讨论) $O(1)$
- 先判定三角形是否成立,即满足两边之和大于第三边,两边之差小于第三边。不满足直接返回
none
。 - 如果三条边相同,返回
equilateral
。 - 否则,任意两条边相同,返回
isosceles
。 - 否则,返回
scalene
。
时间复杂度
- 常数次判断,时间复杂度为 $O(1)$。
空间复杂度
- 仅需要常数的额外空间。
C++ 代码
class Solution {
public:
string triangleType(vector<int>& nums) {
int x = nums[0], y = nums[1], z = nums[2];
if (!(x + y > z && abs(x - y) < z))
return "none";
if (x == y && y == z)
return "equilateral";
if (x == y || y == z || x == z)
return "isosceles";
return "scalene";
}
};