leetcode 611. 有效三角形的个数(优质解法)

2023-11-30 13:30

本文主要是介绍leetcode 611. 有效三角形的个数(优质解法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码:

class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int length=nums.length;int n=0; //三元组的个数//c 代表三角形最长的那条边for (int c=length-1;c>=2;c--){int left=0;int right=c-1;while (left<right){if(nums[left]+nums[right]>nums[c]){n+=right-left;right--;}else {left++;}}}return n;}
}

题解:

        首先我们要知道如何判断三条边是否可以组成三角形,假设我们有三条边 a,b,c,当 a+b>c && a+c>b && b+c>a 时,a,b,c 三条边就可以组成三角形,但很明显这样判断条件过多,其实我们还有一种判断方法:

        当 a,b 为三条边中较小的两条边时,只要满足 a+b > c,就代表a,b,c 三条边可以组成三角形

        我们在数组中获取参数时,如何知道获取的边是较小的两条边还是较大的一条边呢?可以先将数组进行排序,就可以将右边的数看作较大的一条边,在该数左边的区间找较小的两条边,来判断是否可以组成三角形

        我们以数组 1,4,4,3,2 为例

        经过排序以后数组变为 1,2,3,4,4

        我们就以指针 c(nums.length - 1) 的数据作为构成三角形较大的一条边,现在我们要在该下标左边的区间选择两条边来组成三角形,让 L 指针指向 0 下标,R 指针指向 c-1 下标,两个指针代表此时选中的 a ,b 边,其中 1+4=5>4 代表是一组合格的数据,可以组成三角形

        我们可以思考,L 指针指向的边是最小的边,最小的边加上此时 R 指针指向的边都可以大于第三边,那么 L 指针右边比它大的边加上此时 R 指针指向的边也一定是大于第三边的,所以我们可以得出以 R 指针指向的边作为 b 边,c 指针指向的边作为 c 边有 3组合格的数据,即 R - L 组 合格的数据

1        2        3        4        4

L                            R        c

0        1        2        3        4

        计算出此时 R 指针指向的边作为 b 边的所有情况以后,R 指针就可以向左移动

        此时 1+3=4 <= 4 所以指向的 1,3,4 的三条边不符合要求

1        2        3        4        4

L                  R                  c

0        1        2        3        4

        因为 a ,b边的和小了,但R 指针已经指向了目前最大的一条边,所以要让 L 指针向右移动,此时 2+3=5 > 4 所以有 R - L 组 合格的数据

1        2        3        4        4

          L        R                  c

0        1        2        3        4

        计算出此时 R 指针指向的边作为 b 边的所有情况以后,R 指针就可以向左移动,当 R 指针与 L 指针指向同一个位置时,就代表以 c 指针指向的边作为 c 边的全部情况已经收集完毕,现在我们就需要将 c 指针向左移动,选择新的一条边作为 c 边,继续进行上述的操作

1        2        3        4        4

          L                            c

          R

0        1        2        3        4

        当 c 指针移动到下标 2 的位置后,就代表所有的情况都收集完毕了

1        2        3        4        4

                    c

0        1        2        3        4

        

这篇关于leetcode 611. 有效三角形的个数(优质解法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/437205

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点