【Leetcode刷题Python】611. 有效三角形的个数

简介: 提供了解决LeetCode "有效三角形的个数" 问题的Python实现代码。

1 题目

给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。

示例 1:

输入: nums = [2,2,3,4]
输出: 3
解释:有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3

2 解析

对于正整数 a, b, ca,b,c,它们可以作为三角形的三条边,当且仅当:

\begin{cases} a + b > c \\ a + c > b \\ b + c > a \end{cases}

a+b>c
a+c>b
b+c>a

均成立。如果我们将三条边进行升序排序,使它们满足a≤b≤ca≤b≤c,那么a+c>b 和b+c>a使一定成立的,我们只需要保证a+b>c。

因此,我们可以将数组nums 进行升序排序,随后使用二重循环枚举 a 和 b。设 a = nums[i], b = nums[j],为了防止重复统计答案,我们需要保证 i < j。
剩余的边 cc需要满足c<nums[i]+nums[j],我们可以在 [j + 1, n - 1][j+1,n−1] 的下标范围内使用二分查找(其中 n 是数组 nums 的长度),找出最大的满足nums[k]<nums[i]+nums[j] 的下标 k,这样一来,在[j+1,k] 范围内的下标都可以作为边 c 的下标,我们将该范围的长度 k - j累加入答案。

3 Python实现

class Solution:
    def triangleNumber(self, nums: List[int]) -> int:

        n = len(nums)
        nums.sort()
        result = 0
        for i in range(n):
            for j in range(i+1,n):
                left,right,k = j+1,n-1,j
                while left<=right:# 注意边界是<=
                    # mid = int((left+right)/2)
                    # 注意使用方法是如下的//
                    mid = (left+right)//2

                    if nums[mid]<nums[i]+nums[j]:
                        k =mid
                        left = mid+1
                    else:
                        right = mid-1
                result +=k-j
        return result
目录
相关文章
|
28天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
28天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
9天前
|
搜索推荐 Python
Leecode 101刷题笔记之第五章:和你一起你轻松刷题(Python)
这篇文章是关于LeetCode第101章的刷题笔记,涵盖了多种排序算法的Python实现和两个中等难度的编程练习题的解法。
15 3
|
14天前
|
数据可视化 数据挖掘 数据处理
Python实现数字按三角形排列
Python实现数字按三角形排列
16 4
|
9天前
|
算法 C++ Python
Leecode 101刷题笔记之第四章:和你一起你轻松刷题(Python)
这篇博客是关于LeetCode上使用Python语言解决二分查找问题的刷题笔记,涵盖了从基础到进阶难度的多个题目及其解法。
12 0
|
9天前
|
算法 C++ Python
Leecode 101刷题笔记之第三章:和你一起你轻松刷题(Python)
本文是关于LeetCode算法题的刷题笔记,主要介绍了使用双指针技术解决的一系列算法问题,包括Two Sum II、Merge Sorted Array、Linked List Cycle II等,并提供了详细的题解和Python代码实现。
11 0
|
9天前
|
算法 C++ 索引
Leecode 101刷题笔记之第二章:和你一起你轻松刷题(Python)
本文是关于LeetCode 101刷题笔记的第二章,主要介绍了使用Python解决贪心算法题目的方法和实例。
7 0
|
16天前
|
算法 数据挖掘 Python
Python 实现数字按照三角形排列详解
Python 实现数字按照三角形排列详解
52 0
|
1月前
|
数据可视化 数据挖掘 数据处理
Python实现数字按三角形排列
Python实现数字按三角形排列
23 0