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]之和大于 n u m s [ i ] nums[i] nums[i],找到了 r − l r-l r−l个三角形;之后r--

否则,l++

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

  • 时间复杂度 O ( l e n ( n u m s ) 2 ) O(len(nums)^2) O(len(nums)2)
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
cpp 复制代码
/*
 * @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
python 复制代码
'''
Author: LetMeFly
Date: 2025-09-26 22:40:03
LastEditors: LetMeFly.xyz
LastEditTime: 2025-09-26 22:47:15
'''
from typing import List

class Solution:
    def triangleNumber(self, nums: List[int]) -> int:
        ans = 0
        nums.sort()
        for i in range(len(nums) - 1, -1, -1):
            l, r = 0, i - 1
            while l < r:
                if nums[l] + nums[r] > nums[i]:
                    ans += r - l
                    r -= 1
                else:
                    l += 1
        return ans
Python
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 List

class Solution:
    def triangleNumber(self, nums: List[int]) -> int:
        ans = 0
        nums.sort()
        for i in range(len(nums) - 1, -1, -1):
            l, r = 0, i - 1
            while l < r:
                if nums[l] + nums[r] > nums[i]:
                    ans += r - l
                    r -= 1
                else:
                    l += 1
        return ans
Java
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
go 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-09-26 22:40:03
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-09-26 22:49:15
 */
package main

import "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 - l
                r--
            } else {
                l++
            }
        }
    }
    return
}
Rust
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为-1
            while l < r {
                if nums[l] + nums[r] > nums[i] {
                    ans += r - l;
                    r -= 1;
                } else {
                    l += 1;
                }
            }
        }
        ans as i32
    }
}

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

千篇源码题解已开源

相关推荐
QQ6765800810 分钟前
基于yolo26算法的水下目标检测图像数据集 海洋生物识别 海胆识别 海龟识别数据集 海洋生物监测与保护工作 潜水作业安全辅助系 水下环境感知第10408期
算法·目标检测·水下目标检测·海洋生物识别·海胆 海龟识别·海洋生物监测与保护工作·潜水作业安全辅助 水下环境感知
七颗糖很甜23 分钟前
基于 OpenCV 的 FY2 云顶图云块追踪算法实现
人工智能·opencv·算法
__Wedream__24 分钟前
NTIRE 2026 Challenge on Efficient Super-Resolution——冠军方案解读
人工智能·深度学习·算法·计算机视觉·超分辨率重建
FL162386312928 分钟前
基于深度学习mediape实现人员跌倒人体姿势跌倒检测算法源码+说明文件
人工智能·深度学习·算法
wangwangmoon_light29 分钟前
1.23 LeetCode总结(树)_一般树
算法·leetcode·职场和发展
被考核重击31 分钟前
基础算法学习
学习·算法
小O的算法实验室33 分钟前
2026年ASOC,学习驱动人工蜂群算法+移动机器人多目标路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
wfbcg1 小时前
每日算法练习:LeetCode 30. 串联所有单词的子串 ✅
算法·leetcode·职场和发展
玉树临风ives1 小时前
atcoder ABC 453 题解
数据结构·c++·算法·图论·atcoder
田梓燊1 小时前
leetcode 48
算法·leetcode·职场和发展