【LeetCode】976. Largest Perimeter Triangle 解题报告(Python)
作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
题目地址:https://leetcode.com/problems/largest-perimeter-triangle/
题目描述
Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero area, formed from 3 of these lengths.
If it is impossible to form any triangle of non-zero area, return 0.
Example 1:
Input: [2,1,2]
Output: 5
Example 2:
Input: [1,2,1]
Output: 0
Example 3:
Input: [3,2,3,4]
Output: 10
Example 4:
Input: [3,6,2,3]
Output: 8
Note:
- 3 <= A.length <= 10000
- 1 <= A[i] <= 10^6
题目大意
从一个数组中选择3条边构成三角形,求该三角形最大的周长。
解题方法
排序
首先,我们肯定需要排序的,这个不解释。
假设排序完成之后的数组为[a, b, c, d, e, f],其中a <= b <= c <= d <= e <= f.为了尽可能构成周长最大的三角形,我们从右向左进行遍历。只需要对连续的三条边进行判断即可找出周长最大的三角形。理由如下。
抽出三条边,假设为d,e,f,那么这三条边组成三角形的充分条件是d + e > f。下面进行证明:
对于任意三条边,能组成三角形的充分条件是两边之和大于第三边,两边之差小于第三边。由于d <= e <= f,显然有e + f > d,d + f > e。又d + e > f,则满足任意两边之和大于第三边。由于d <= e <= f,则e - d < f。又d + e > f,则f - e < d, f - d < e,则满足任意两边只差小于第三边。所以,当d + e > f时能够成三角形。
下面证明选取的次大边和最大边必须相邻,即如果最大边选择f,则次大边必须选择e。由d + e > f知, 最大边 - 次大边 < 最小边。当我们次大边选择e时,假如最小边无论如何选择不能构成三角形,即target = f - e > d。那么,次大边选择更小的数字时,target会更大,仍然有target = f - d > f - e > d > c。总之,如果当次大边选择和最大边相邻时,如果不能构成三角形,则次大边和最大边不相邻,更不能构成三角形。
再下面证明,最小边必须和次大边必须相邻,即如果最大边选择f、次大边选择e时,最小边必须选择d。这个很好证明,由于d + e > f,即target = f - e < 最小边,我们肯定只能在满足该条件的边中选择最大的,才能使得构成三角形的周长最大。而数组是已经排了序的,所以,最小边选择d时,要么不能构成三角形,要么就构成在最大边和次大边为f,e时周长最大的三角形。
综上,在排序了的数组中选择三条边构成最大周长的三角形的充分条件是,三条边必须连续选择,且尽可能选择最大的边。
python代码如下:
class Solution(object):
def largestPerimeter(self, A):
"""
:type A: List[int]
:rtype: int
"""
A.sort()
N = len(A)
res = 0
# A[i - 2], A[i - 1], A[i]
for i in range(N - 1, 1, -1):
if A[i - 2] + A[i - 1] > A[i]:
return A[i - 2] + A[i - 1] + A[i]
return 0
日期
2019 年 1 月 13 日 —— 时间太快了
【LeetCode】976. Largest Perimeter Triangle 解题报告(Python)的更多相关文章
- LeetCode 976 Largest Perimeter Triangle 解题报告
题目要求 Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero ...
- LeetCode 976. Largest Perimeter Triangle (三角形的最大周长)
题目标签:Array 题目给了我们一个 边长的 array, 让我们找出 最大边长和的三角形,当然前提得是这三条边能组成三角形.如果array 里得边长组成不了三角形,返回0. 最直接的理解就是,找到 ...
- Leetcode 976. Largest Perimeter Triangle
送分题 class Solution(object): def largestPerimeter(self, A): """ :type A: List[int] :rt ...
- 【Leetcode_easy】976. Largest Perimeter Triangle
problem 976. Largest Perimeter Triangle solution: class Solution { public: int largestPerimeter(vect ...
- 【leetcode】976. Largest Perimeter Triangle
题目如下: Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero ...
- 976. Largest Perimeter Triangle
Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero area, ...
- 「Leetcode」976. Largest Perimeter Triangle(C++)
分析 好久不刷题真的思维僵化,要考虑到这样一个结论:如果递增的三个数\(x_i,x_{i+1},x_{i+2}\)不符合题意,那么最大的两边之差一定大于等于第一条边,那么任何比第一条边小的都不能成立. ...
- 【LeetCode】62. Unique Paths 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/unique-pa ...
- LeetCode 976. 三角形的最大周长(Largest Perimeter Triangle) 33
976. 三角形的最大周长 976. Largest Perimeter Triangle 题目描述 给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. ...
随机推荐
- [R] 添加误差棒的分组折线图:geom_path: Each group consists of only one observation. Do you need to adjust the...
想做一个简单的分组折线图,并添加误差棒,类似下面这样的: 用ggplot似乎很简单就能实现:ggplot+geom_errorbar+geom_line+geom_point,重点在于计算误差棒. 还 ...
- micropython1.16官方文档转PDF
折腾了一天,终于把micropython1.16的官方文档给转成了pdf格式. 不过转换成PDF格式以后存在两点问题: 1.PDF文档有些地方的排版中有些行距没有调整好: 2.使用latex编译tex ...
- 23-Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...
- OpenSSH 密码和公钥认证原理探究
目录 配置和保护SSH H3 - 使用SSH 访问远程命令行 H4 - 什么是OpenSSH ? H4 - 登录方式: H4 - 登录并执行临时命令: H4 - 查看登录用户 H4 - 登录原理 密码 ...
- C#序号
OnRowCreated="gridViewCorrection_RowCreated" <asp:BoundField HeaderText="序号" ...
- A Child's History of England.24
Besides all these troubles, William the Conqueror was troubled by quarrels among his sons. He had th ...
- Flink(九)【Flink的重启策略】
目录 1.Flink的重启策略 2.重启策略 2.1未开启checkpoint 2.2开启checkpoint 1)不设置重启策略 2)不重启 3)固定延迟重启(默认) 4)失败率重启 3.重启效果演 ...
- Linux基础命令---mput上传ftp文件
mput 使用lftp登录ftp服务器之后,可以使用put指令将文件上传到服务器.mput指令可以使用通配符,而put指令则不可以. 1.语法 mput [-c] [-d] [-a] ...
- oralce 存储过程传入 record 类型的参数?
先定义一个 package , package中含有一个 record 类型的变量 create or replace package pkg_record is type emp_record is ...
- MyBatis(3):优化MyBatis配置文件
一.连接数据库的配置单独放在一个properties文件中 1,创建一个database.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql: ...