当前位置: 首页 > news >正文

LeetCode 0611.有效三角形的个数:双指针

【LetMeFly】611.有效三角形的个数:双指针

力扣题目链接:https://leetcode.cn/problems/valid-triangle-number/

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

 

示例 1:

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

示例 2:

输入: nums = [4,2,3,4]
输出: 4

 

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000

解题方法:双指针

当两短边之和大于长边时,三条边可以组成三角形。

因此我们可以第一层循环枚举最长边(数组排序后从后往前枚举),至于两个短边则使用双指针:

初始时候l = 0, r = i - 1

如果nums[l] + nums[r] > nums[i],则说明l, l + 1, l + ...的任何一个都可以和nums[r]之和大于nums[i]nums[i]nums[i],找到了r−lr-lrl个三角形;之后r--

否则,l++

内层双指针相当于是在外层三角形最长边确定的情况下,从右往左看看第二长边为nums[r]nums[r]nums[r]时有多少个nums[l]nums[l]nums[l]可以匹配。如果当前nums[l]无法匹配则右移l直至能匹配上为止,否则就往左枚举下一个第二长边r。

  • 时间复杂度O(len(nums)2)O(len(nums)^2)O(len(nums)2)
  • 空间复杂度O(1)O(1)O(1)

AC代码

C++
/** @Author: LetMeFly* @Date: 2025-09-26 22:40:03* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-09-26 22:44:19*/
class Solution {
public:int triangleNumber(vector<int>& nums) {int ans = 0;sort(nums.begin(), nums.end());for (int i = nums.size() - 1; i >= 0; i--) {for (int l = 0, r = i - 1; l < r;) {if (nums[l] + nums[r] > nums[i]) {ans += r - l;r--;} else {l++;}}}return ans;}
};
Python
'''
Author: LetMeFly
Date: 2025-09-26 22:40:03
LastEditors: LetMeFly.xyz
LastEditTime: 2025-09-26 22:47:15
'''
from typing import Listclass Solution:def triangleNumber(self, nums: List[int]) -> int:ans = 0nums.sort()for i in range(len(nums) - 1, -1, -1):l, r = 0, i - 1while l < r:if nums[l] + nums[r] > nums[i]:ans += r - lr -= 1else:l += 1return ans
Python
'''
Author: LetMeFly
Date: 2025-09-26 22:40:03
LastEditors: LetMeFly.xyz
LastEditTime: 2025-09-26 23:04:01
'''
__import__("atexit").register(lambda: open("display_runtime.txt", "w").write("0"))
from typing import Listclass Solution:def triangleNumber(self, nums: List[int]) -> int:ans = 0nums.sort()for i in range(len(nums) - 1, -1, -1):l, r = 0, i - 1while l < r:if nums[l] + nums[r] > nums[i]:ans += r - lr -= 1else:l += 1return ans
Java
/** @Author: LetMeFly* @Date: 2025-09-26 22:40:03* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-09-26 22:51:26*/
import java.util.Arrays;class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int ans = 0;for (int i = nums.length - 1; i >= 0; i--) {for (int l = 0, r = i - 1; l < r;) {if (nums[l] + nums[r] > nums[i]) {ans += r - l;r--;} else {l++;}}}return ans;}
}
Go
/** @Author: LetMeFly* @Date: 2025-09-26 22:40:03* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-09-26 22:49:15*/
package mainimport "sort"func triangleNumber(nums []int) (ans int) {sort.Ints(nums)for i := len(nums) - 1; i >= 0; i-- {for l, r := 0, i - 1; l < r; {if nums[l] + nums[r] > nums[i] {ans += r - lr--} else {l++}}}return
}
Rust
/** @Author: LetMeFly* @Date: 2025-09-26 22:40:03* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-09-26 23:00:24*/
impl Solution {pub fn triangle_number(mut nums: Vec<i32>) -> i32 {nums.sort();let mut ans: usize = 0;for i in (0..nums.len()).rev() {let mut l: usize = 0;let mut r: usize = i.saturating_sub(1);  // 防止unsize为-1while l < r {if nums[l] + nums[r] > nums[i] {ans += r - l;r -= 1;} else {l += 1;}}}ans as i32}
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

http://www.dtcms.com/a/410760.html

相关文章:

  • js 网站校验网络营销推广的优势
  • 好的响应式网站注册域名免费永久
  • 无人机图传模块——让飞行视界无界限
  • Redis有序集合:高效排行榜实现方案
  • 专门做化妆的招聘网站新手要如何让网站被收录
  • Gli appunti di scienza dei dati[5]
  • 【mdBook】1 安装
  • 唐山网站建设费用廊坊市做网站的公司有哪些
  • AI大模型学习(16)AI大模型在电商行业的一些应用(淘宝的以图搜图技术)
  • 【日常学习】UI自动化自定义异常类
  • 个人项目开发经验总结:从实践中提炼的宝贵心得
  • Linux条件变量:pthread_cond_init、pthread_cond_wait等函数详解
  • HashMap的api使用详解
  • IS-IS核心解析:驱动现代网络的隐形力量
  • Unity地面震动的效果
  • Unity Shader变体管理最佳实践
  • 网站开发目的重庆建设工程信息网 官网
  • 镇江网站排名优化费用wordpress推广积分插件
  • 基于51单片机的自习室人数统计系统
  • C4D口红建模核心技巧:优质布线的思路与操作方法
  • 虚拟机管理程序(Hypervisor)
  • 黑盒测试和白盒测试
  • iree 上运行qwen2.5 05b运行效率
  • dw手机网站怎么做软文推广代理平台
  • qq刷赞网站推广软件广告机 东莞网站建设
  • 佛山网站建设原创网站底部版权信息
  • Unity / C# 开发常见问题总结(闭包、协程、事件、GC 等易踩坑)
  • C# 集合框架完全指南:从IEnumerable到ObservableCollection的深度解析
  • 用户研究:用户研究和数据分析的根本联系与区别
  • 网站关键词优化培训jeecg 3.7 网站开发