P15.3 CountTriangles
Count the number of triangles that can be built from a given set of edges.
-
P15.3 三角形的数量
计算给定的数组可以构建为三角形的数量
给定一个由N个整数组成的数组A。三联体(P, Q, R)是三角形的,如果可以建立一个边长为A[P], A[Q]和A[R]的三角形。换句话说,如果0≤P<Q<R<N,则称三联体(P, Q, R)是三角形的,并且:
- A[P]+A[Q]>A[R]
- A[Q]+A[R]>A[P]
- A[R]+A[P]>A[Q]
例如,考虑数组A: A[0]=10,A[1]=2,A[2]=5,A[3]=1,A[4]=8,A[5]=12。这个数组的元素可以构成四个三角形的三联体,即(0,2,4),(0,2,5),(0,4,5)和(2,4,5)。
编写函数:
def solution(A)
给定一个由N个整数组成的数组A,则返回该数组中是三角形的三联体的数目。例如,针对上面的例子,函数应该返回4。
假定:
- N是区间[0,1,000]内的整数;
- 数组A的每个元素都是区间[1,1,000,000,000]内的整数;
- 解题思路
首先将A排序,排序不影响元素大小,因此也不会影响结果。排序的好处在于:对于排序后的数组B,索引a<b<c,如果B[a]+B[b]>B[c],则说明(a,b,c)可以组成三角形,并且对于b和c之间的任何索引d而言,三联体(a,b,d)也一定可以组成三角形,因此继续增加索引c,直到(a,b,c)不能构成三角形。如果B[a]+B[b]>B[c]不成立,说明需要增大索引b,如果b没有增大的空间(b<c需要成立),则同时增大索引b和c。
- Python代码
# -*- coding:utf-8 -*-
# &Author AnFany
# Lesson 15:Caterpillar method
# P 15.3 CountTriangles
def solution(A):
"""
返回数组A的元素可以构成三角形的个数。
:param A: 数组
:return: 构成三角形的个数
"""
# 首先将A进行排序
A.sort()
count_triangle = 0
for index, value in enumerate(A):
middle_idx = index + 1
biggest_idx = index + 2
while biggest_idx < len(A):
if value + A[middle_idx] > A[biggest_idx]: # 此时可以构成三角形
count_triangle += biggest_idx - middle_idx # 最大值到中间值之间的均能构成三角形
biggest_idx += 1 # 增大最大值
elif middle_idx < biggest_idx - 1: # 够不成三角形,如果中间值较小,则试着增加中间值
middle_idx += 1
else: # 如果中间值没有增加的余地,则同时增加中间值,和最大值。因为只增加最大值,还是够不成三角形
biggest_idx += 1
middle_idx += 1
return count_triangle
- 结果
点击获得更多编程练习题。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。
image image
网友评论