Skip to content

Commit 7150dd9

Browse files
committed
feat: 976.三角形的最大周长
1 parent cb32b25 commit 7150dd9

File tree

2 files changed

+144
-0
lines changed

2 files changed

+144
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@
259259

260260
- [x] [135.分发糖果](./topics/greedy/ext-candy.md)
261261
- [x] [455.分发饼干](./topics/greedy/ext-assign-cookies.md)
262+
- [x] [976.三角形的最大周长](./topics/greedy/ext-largest-perimeter-triangle.md)
262263

263264
## 其他
264265

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# 976. 三角形的最大周长
2+
3+
https://leetcode-cn.com/problems/largest-perimeter-triangle/
4+
5+
- [976. 三角形的最大周长](#976-三角形的最大周长)
6+
- [题目描述](#题目描述)
7+
- [方法 1:暴力(TLE)](#方法-1暴力tle)
8+
- [思路](#思路)
9+
- [复杂度分析](#复杂度分析)
10+
- [代码](#代码)
11+
- [方法 2:贪心](#方法-2贪心)
12+
- [思路](#思路-1)
13+
- [复杂度分析](#复杂度分析-1)
14+
- [代码](#代码-1)
15+
16+
## 题目描述
17+
18+
```
19+
给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。
20+
21+
如果不能形成任何面积不为零的三角形,返回 0。
22+
23+
 
24+
25+
示例 1:
26+
27+
输入:[2,1,2]
28+
输出:5
29+
示例 2:
30+
31+
输入:[1,2,1]
32+
输出:0
33+
示例 3:
34+
35+
输入:[3,2,3,4]
36+
输出:10
37+
示例 4:
38+
39+
输入:[3,6,2,3]
40+
输出:8
41+
 
42+
43+
提示:
44+
45+
3 <= A.length <= 10000
46+
1 <= A[i] <= 10^6
47+
48+
来源:力扣(LeetCode)
49+
链接:https://leetcode-cn.com/problems/largest-perimeter-triangle
50+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
51+
```
52+
53+
## 方法 1:暴力(TLE)
54+
55+
### 思路
56+
57+
符合直觉的思路,三层循环,暴力枚举所以能组成三角形的三条边组合,找最大值,但复杂度过高超时了(64 / 84 个通过测试用例)。
58+
59+
### 复杂度分析
60+
61+
- 时间复杂度:$O(N^3)$。
62+
- 空间复杂度:$O(1)$。
63+
64+
### 代码
65+
66+
JavaScript Code
67+
68+
```js
69+
/**
70+
* @param {number[]} A
71+
* @return {number}
72+
*/
73+
var largestPerimeter = function (A) {
74+
let max = 0;
75+
for (let i = 0; i < A.length; i++) {
76+
for (let j = i + 1; j < A.length; j++) {
77+
for (let k = j + 1; k < A.length; k++) {
78+
if (isValidTri(A[i], A[j], A[k])) {
79+
max = Math.max(max, A[i] + A[j] + A[k]);
80+
}
81+
}
82+
}
83+
}
84+
return max;
85+
86+
// ****************************
87+
function isValidTri(a, b, c) {
88+
return a + b > c && a + c > b && b + c > a;
89+
}
90+
};
91+
```
92+
93+
## 方法 2:贪心
94+
95+
### 思路
96+
97+
- 因为我们是要得到三角形的 `最大周长`,所以当然要尽可能地选 `最长` 的边。
98+
- 第一步我们先选定一条最长的边,那剩下的两条边怎么确定呢?
99+
- 首先,组成三角形的三条边需要满足条件:`(a + b > c) && (a + c > b) && (b + c > a)`,这个条件我们可以简化成 `a + b > c`,其中 c 是最长的边,a 和 b 是较短的边。
100+
- 当我们选定了最大的数字作为最长边 c 之后,只需要在剩下的数字中找出最大的两个:
101+
- 如果它们的和大于 c,那这个组合就是我们要找的答案了;
102+
- 如果它们的和小于 c,那也没有其他符合要求的数字了,这时我们需要放弃这个最长边,重新选择第二大的数字作为最长边 c。
103+
104+
具体做法就是降序排序,依次选择 `A[i]` 作为最长边进行判断。
105+
106+
### 复杂度分析
107+
108+
- 时间复杂度:$O(NlogN)$。
109+
- 空间复杂度:$O(1)$。
110+
111+
### 代码
112+
113+
JavaScript Code
114+
115+
```js
116+
/**
117+
* @param {number[]} A
118+
* @return {number}
119+
*/
120+
var largestPerimeter = function (A) {
121+
A.sort((a, b) => b - a);
122+
for (let i = 0; i < A.length - 2; i++) {
123+
if (A[i] < A[i + 1] + A[i + 2]) return A[i] + A[i + 1] + A[i + 2];
124+
}
125+
return 0;
126+
};
127+
```
128+
129+
Python Code
130+
131+
```py
132+
class Solution(object):
133+
def largestPerimeter(self, A):
134+
"""
135+
:type A: List[int]
136+
:rtype: int
137+
"""
138+
A.sort(reverse=True)
139+
for i in range(len(A) - 2):
140+
if A[i] < A[i + 1] + A[i + 2]:
141+
return A[i] + A[i + 1] + A[i + 2]
142+
return 0
143+
```

0 commit comments

Comments
 (0)