leecode611 有效三角形的个数

611. 有效三角形的个数 通过排序和双指针法的结合,我们能够在O(n^2)的时间复杂度内有效地解决这个问题。与暴力解法相比,优化解法显著提高了效率,适用于较大的输入数据。希望这篇博客能够帮助你更好地理解如何通过排序和双指针法来解决这个经典的三角形问题。 阅读详情

在这里插入图片描述

我的思路(暴力解)

这个题感觉和前面不太一样了,双指针的变化规律我没有找出来,当判断出三角形之后我发现无论移动左指针,还是移动右指针,三角形都是成立的。一时半会没想到怎么解决,我就直接暴力破解了,直接遍历所有情况,就可以解决问题了。

public int triangleNumber(int[] nums) {
    Arrays.sort(nums);
    int n = nums.length;
    int ans=0;
    for(int i = 0;i<n-2;i++){
        int x = nums[i];
        for(int j = i+1;j<n-1;j++){
            int k = n-1;
            while(j<k){
                int y = nums[i]+nums[j]-nums[k];
                if(y>0){
                    ans++;
                }
                k--;
            }
        }
    }
    return ans;
}

优化方案,我发现这个ans不用每次都进行++,可以直接统计出来所有满足的。

while(j<k){
    int y = nums[i] + nums[j] - nums[k];
    if (y > 0) {
        int len = k-j;
        ans+=len;
        break;
    }
    k--;                   
}

灵神思路

灵神就是强,当我还再纠结这个无法判断双指针移动方向的时候,灵神已经是另一个境界了,他并不是类似于传统的枚举最短的那一个,而是换了一种思路,枚举最长的。让最外层从i=2开始,然后让j和k是i的左边的边。

此时双指针就很容易的判断出移动方向了

当左边两个短边的和 nums[j]+nums[k]大于 最外层的nums[i]的时候,三角形成立,此时从i到j,都是满足条件的三角形(我们不用对j进行++了),我们将其加入结果ans += j - i;,然后k--

当左边两个短边的和小于等于最外层的时候,三角形不成立,我们要扩大短边的话,直接j++

class Solution {
    public int triangleNumber(int[] nums) {
        Arrays.sort(nums);
        int ans = 0;
        for (int k = 2; k < nums.length; k++) {
            int c = nums[k];
            int i = 0; // a=nums[i]
            int j = k - 1; // b=nums[j]
            while (i < j) {
                if (nums[i] + nums[j] > c) {
                    // 由于 nums 已经从小到大排序
                    // nums[i]+nums[j] > c 同时意味着:
                    // nums[i+1]+nums[j] > c
                    // nums[i+2]+nums[j] > c
                    // ...
                    // nums[j-1]+nums[j] > c
                    // 从 i 到 j-1 一共 j-i 个
                    ans += j - i;
                    j--;
                } else {
                    // 由于 nums 已经从小到大排序
                    // nums[i]+nums[j] <= c 同时意味着
                    // nums[i]+nums[j-1] <= c
                    // ...
                    // nums[i]+nums[i+1] <= c
                    // 所以在后续的内层循环中,nums[i] 不可能作为三角形的边长,没有用了
                    i++;
                }
            }
        }
        return ans;
    }
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/valid-triangle-number/solutions/2432875/zhuan-huan-cheng-abcyong-xiang-xiang-shu-1ex3/
来源:力扣(LeetCode)
基于python的奥运会历史数据分析【120年】 数据分析实战案例 阅读详情

相关推荐

《从0到1:CTFer成长之路》书籍配套题目-[第二章 web进阶]文件上传

[第二章 web进阶]文件上传开始行动绕过第1个限制绕过第2个限制 介绍:记录一下笔记,方便以后迅速回忆使用。 《从0到1:CTFer成长之路》书籍配套题目,来源网站:《从0到1:CTFer成长之路》 先看一下题目源码: <?php header("Content-Type:text/html; charset=utf-8"); // 每5分钟会清除一次目录下上传的文件 require_once('pclzip.lib.php'); if(!$_FILES){ echo '

weixin_46703850的博客 3411

leecode611&976.有效三角形的个数(双指针法)&三角形的最大周长

一、有效三角形的个数 题目描述: 给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。 输入: [2,2,3,4] 输出: 3 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 算法思路:双指针法 https://leetcode-cn.com/problems/valid-triangle-number/solutio...

萌二三 230

提示deepseek生成完整的json用于对接外部API

通过精准的提示词设计(字段过滤、格式约束)、动态验证机制(自检与修正)和官方模板参考,可有效确保DeepSeek生成的JSON纯净无冗余。

神棍之路 2308

【算法专题--双指针算法】leecode-611. 有效三角形的个数(medium)、leecode-LCR 179. 查找总价格为目标值的两个商品(easy)

双指针常见的双指针有两种形式,一种是对撞指针,⼀种是左右指针。对撞指针:一般用于顺序结构中,也称左右指针。对撞指针从两端向中间移动。一个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。对撞指针的终止条件一般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:left == right (两个指针指向同一个位置)left > right (两个指针错开)快慢指针:又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上移动。

RO-BERRY 1009

人工智能在高中教育中的应用现状剖析与挑战应对

人工智能在高中教育中的应用现状剖析与挑战应对

燕鹏 1338

VS2019手动添加bits/stdc++.h全指南(附解决‘无法打开源文件‘错误)

本文详细介绍了在Visual Studio 2019中手动配置C++万能头文件bits/stdc++.h的完整方法,解决常见的'无法打开源文件'错误。通过分析GCC与MSVC编译器生态差异,提供了纯手动创建和MinGW移植两种可靠方案,并给出详细的步骤、常见错误排查及最佳实践建议,帮助开发者高效配置竞赛开发环境。

weixin_29011395的博客 547

【算法专题】双指针算法之611. 有效三角形的个数(力扣)

双指针算法之611. 有效三角形的个数(力扣)

cilmy23的note 1515

跨平台也要跑得像原生一样顺:SAP GUI for Java 的安装、配置、运维与自动化实战

摘要:SAP GUI for Java 作为跨平台客户端解决方案,在 S/4HANA 时代仍发挥关键作用,特别适用于 macOS/Linux 环境下的 ABAP 开发和系统运维。其主要优势包括:平台无关性(支持 Windows/macOS/Linux/UNIX)、与 Windows 版本一致的交互体验、对核心事务码(如 ST22/SM21)的完整支持。版本管理需注意 7.80 已停止支持,建议升级至 8.10。安装支持原生包和通用 JAR 两种方式,推荐团队标准化版本和连接配置(通过 SAP UI Land

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 678

LeetCode 611. 有效三角形的个数

a = 4, b = 6, c = 9,a + b > c,成立,因为在a到b这个区间中,a此时是最小的,而数据又是单调递增 (有序的),因此,在 a 和 b 中间的值就不需要再判断了,此时一定可以和 b = 6,c = 9 构成三角形,因此,此时可以构成三角形的个数:b的下标 - a 的下标,b向左移动。而 a + c > b 和 b + c > a 不需要判断,因为此时c是最大的数据,最大的数据加上一个非负数,一定大于另外的一个数据,比如,a + c 是一定大于 b 的。2,3,4 (使用第一个4)

m0_62229058的博客 1559

40.8K星爆火!Crawl4AI实战突破Cloudflare 5秒盾:AI反爬新范式,爬虫再也不被封

Crawl4AI的爆火(40.8K星)不是偶然——它解决了爬虫工程师最头疼的反爬问题,让爬虫从“体力活”变成“脑力活”,不用再花费大量时间配置指纹、编写行为脚本。但要注意:爬虫必须遵守目标网站的robots.txt协议,不得用于非法爬取数据(比如用户隐私、商业机密)。合理使用技术,才能长久落地。如果你在使用Crawl4AI时遇到具体问题(比如绕过更严格的反爬、批量爬取配置),欢迎在评论区交流,我会第一时间分享解决方案!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1603

【100%通过率】华为OD机试真题 C++ 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

LeetCode 分类刷题:611. 有效三角形的个数

这道题目要求从给定的非负整数数组中找出能构成三角形的三元组个数。关键思路是:先对数组排序,然后枚举最长边c,使用双指针法寻找满足a+b大于c的较短边a和b。当a+b大于c时,i到j-1之间的所有元素与b的组合都满足条件,然后移动j指针;否则移动i指针。时间复杂度为O(n^2),空间复杂度为O(1)。通过排序和双指针技巧,有效地避免了重复统计并优化了查找过程。

flashlight_hi的博客 1310

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Leetcode 611. 有效三角形的个数 C++

Leetcode 611. 有效三角形的个数 题目 给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。 示例: 输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 注意: 数组长度不超过1000。 数组里整数的范围为 [0, 1000]。 题解 我们将数组进行逆序排序,依次遍历数组i作为最长边,我们利用两边之和大于最长边这个性质,我们用双指针在i+1~n-1中找到符合要求的边界,用l

weixin_43750513的博客 617

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【LeetCode: 611. 有效三角形的个数 + 排序 + 双指针】

【LeetCode: 611. 有效三角形的个数 + 排序 + 双指针】给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。

Coder_ljw的博客 770

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

算法训练-力扣.611有效三角形的个数(贪心)

力扣.611有效三角形的个数 解题思路 优化步骤 以及最终代码。

werewolfwerewolf的博客 1565

LeetCode611. 有效三角形的个数

LeetCode611. 有效三角形的个数 1. 问题描述 2. 思路 三条长度为 a、b、c 的线段,能够组成三角形的充要条件是: a+b>ca + b > ca+b>c a+c>ba + c > ba+c>b b+c>ab + c > ab+c>a 2.1 思路一   解决本题的过程,就是一个搜索的过程。一种解决方案是,获取nums数组中所有长度为3的组合,判断能否满足上面三角形构成的条件。   上述解决方案是使用暴力回溯的方式,从长度为3的组合中

菜到不敢run 524

【算法】双指针(五)-有效三角形的个数

本文结合力扣习题-有效三角形的个数,讲解了如何暴力枚举化成优解的步骤

Brookty的博客 972

LeetCode 611.有效三角形的个数

有效三角形的判断方法为两边之和大于第三边,所以我们可以先对该数组进行,再对其进行判断。假如我们以,那么先将4固定住,左指针在第一个数,,那么我们首先判断左右指针相加情况,此时大于4,而该数组有序排列,所以可以得出,可以用right-left统计该区间所有有效组合,最后right–继续判断。当right走到2时,left+right<4,,则该区间没有有效组合,可以直接left++,不再关注right往左的情况。

m0_63816268的博客 702

优先算法 —— 双指针系列 - 有效三角形的个数

那么说明a之后的值加上b都是大于c的。

hedhjd的博客 1835

【力扣刷题实战】有效三角形的个数

文章目录目录力扣题目: 有效三角形的个数题目描述解题思路问题理解算法选择具体思路解题要点完整代码(C++)兄弟们共勉 !!! 每篇前言

2401_85548793的博客 1102

LeetCode 611.有效三角形个数

LeetCode 611.有效三角形个数 题目:给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。 **方法一:**排序+暴力枚举 思路: 排序,暴力枚举所有三元组,统计符合条件的三元组个数,注意不要重复枚举。固定两边枚举第三边。 排序时间复杂度为 O(nlogn);三层遍历找所有三元组的复杂度为 O(n3),整体复杂度O(n3);数据量较大会TLE。 class Solution { public: int triangleNumber(vector<int&g

weixin_48276900的博客 629

Leetcode 611:有效三角形的个数

题目描述 给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。 示例 1: 输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 注意: 数组长度不超过1000。 数组里整数的范围为 [0, 1000]。 来源:力扣(LeetCode) 链接:https://leetcod...

weixin_35338624的博客 473

LeetCode.611有效三角形的个数

保持p不动,判断left和right指向的元素之和与p的大小关系,若和大于p指向的元素,那么对于left、right、p指向的元素构成的三元组是能构成三角形的,同时,以right为基准,left到right之间的元素均大于left指向的元素,由单调性可知,left到right之间的元素与right相加的和也一定大于p指向的元素,那么count就要加上right - left,再将right向左移动一位;当right

2301_79184547的博客 576

能否构成三角形的条件代码_leetcode No.611 有效三角形的个数

题目链接:611. 有效三角形的个数 - 力扣(LeetCode)​leetcode-cn.com题目描述:给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。示例 1:输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3注意:数组长度不超过1000。数组里整数的范围为 [0, 10...

weixin_39943370的博客 344

LeetCode - 611.有效三角形个数

【代码】LeetCode - 611.有效三角形个数。

2402_83315537的博客 328

【优选算法】有效三角形的个数(双指针算法)

三层for循环枚举出所有三元组,判读每组是否能构成三角形,会超时,但是我们可以再优化一下:先对数组进行排序,只需判断三元组中最小的两个数是否大于第三个数即可,省略有一些不必要的判断。时间复杂度为O(N)。

稻草人 568
上一篇: leecode18 四数之和
下一篇: leecode42 接雨水
TranquilGlow
博客等级 码龄5年 132粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值