LintCode-三角形计数

给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形?

样例

例如,给定数组 S = {3,4,6,7},返回 3

其中我们可以找到的三个三角形为:

{3,4,6}
{3,6,7}
{4,6,7}

给定数组 S = {4,4,4,4},
返回 3

其中我们可以找到的三个三角形为:

{4(1),4(2),4(3)}
{4(1),4(2),4(4)}
{4(1),4(3),4(4)}
{4(2),4(3),4(4)}

分析:枚举3条边的话会超时,所以只能枚举最大边和最小边,剩下一条用二分查找来确定范围。

代码:

class Solution {
public:
    /**
     * @param S: A list of integers
     * @return: An integer
     */
    int triangleCount(vector<int> &S) {
        // write your code here
        int ret = 0;
		int n = S.size();
		sort(S.begin(), S.end());
		for (int i = 0;i<n;i++)
		{

			for (int j = i + 1;j<n;j++)
			{
				int l = i+1;
				int r = j;
				int target = S[j]-S[i];
				while(l<r)
				{
				    int mid = (l+r)/2;
				    if(S[mid]>target)
				        r = mid;
				    else
				        l = mid+1;
				}
				ret += (j-l);
			}
		}
		return ret;
    }
};
时间: 2024-10-13 04:24:01

LintCode-三角形计数的相关文章

Java实现三角形计数

题: 解: 这道题考的是穷举的算法. 一开始看到这道题的时候,本能的想到用递归实现.但使用递归的话数据少没问题,数据多了之后会抛栈溢出的异常.我查了一下,原因是使用递归创建了太多的变量, 每个变量创建的时候都会有一个“栈帧”,而Java虚拟机对栈帧有限制,不能超出一个范围. 并且递归和循环相比,递归的效率明显比循环低下,如果想要写一个算法的话,尽量不要使用递归,一方面是因为递归会创建很多变量,占用内存,另一方面是递归极容 易无限递归. --------------- 最后使用循环嵌套的方式完成了

洛谷 P2807 三角形计数

P2807 三角形计数 题目背景 三角形计数(triangle) 递推 题目描述 把大三角形的每条边n等分,将对应的等分点连接起来(连接线分别平行于三条边),这样一共会有多少三角形呢?编程来解决这个问题. 输入输出格式 输入格式: 第一行为整数t(≤100),表示测试数据组数:接下来t行,每行一个正整数n(≤500). 输出格式: 对于每个n,输出一个正整数,表示三角形个数. 输入输出样例 输入样例#1: 复制 3 1 2 3 输出样例#1: 复制 1 5 13 说明 n(≤500) t(≤10

611. Valid Triangle Number三角形计数

[抄题]: 给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形? [暴力解法]: 全部都用for循环 时间分析: 空间分析: [思维问题]: 可以用两层循环:for循环中嵌套while,用过但是没意识 [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: [一刷]: [二刷]: [三刷]: [四刷]: [五刷]: [五分钟肉眼debug的结果]: [总结]:

luogu P2992 [USACO10OPEN]三角形计数Triangle Counting

https://www.luogu.org/problemnew/solution/P2992 考虑包含原点,不包含原点的三角形有什么特征. 包含原点的三角形:任意找一个顶点和原点连线,一定能把另外两个顶点隔开到两侧. 不包含原点的:三个顶点中只有一个顶点满足:和原点连线后,能把另外两个顶点隔开到两侧. 因此我们统计这样的三点组(x,y,z)的数目:x和原点的连线能把y和z隔开在两侧. 一共C(n,3)个三角形,包含原点的贡献3个三点组,不包含的只贡献1个. 统计三点组的数目只需要把所有点按照极

【USACO10 OPEN】三角形计数

题面 https://www.luogu.org/problem/P2992 题解 如果一个三元点集构成黄金三角形,则他们对原点的夹角加起来为$2\pi$, 所以考虑补集转换,不构成黄金三角形的三元点集,可以画一条过原点的直线,使他们都在直线一边. 枚举直线,双指针. 注意这题$atan2(y,x)$精度是足够的,因为有保证. #include<cmath> #include<cstdio> #include<cstring> #include<iostream&

NYOJ491幸运三角形

幸运三角形 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为‘+’,反之,为‘-’;如下图所示(n = 3 时的两种情况): 如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2). 输入 有多组测试数据(少于20组).每行含一个整数n(0

回溯法--符号三角形问题

问题描述: 如下图是由14个“+”和14个“-”组成的符号三角形, 2个同号下面都是“+”,2个异号下面都是“-”. - + + - + + +   - + - - + +    - - + - +     + - - -      - + +       - +        - 在一般情况下,符号三角形的第一行有n个符号, 符号三角形问题要求对于给定的n, 计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同.  解题思路: 1.不断改变第一行每个符号,搜索符合条件的解,可以使用

回溯法之符号三角形问题

/*回溯法解符号三角形问题 问题描述: 如下图是由14个“+”和14个“-”组成的符号三角形, 2个同号下面都是“+”,2个异号下面都是“-”. - + + - + + + - + - - + + - - + - + + - - - - + + - + - 在一般情况下,符号三角形的第一行有n个符号, 符号三角形问题要求对于给定的n, 计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同. 解题思路: 1.不断改变第一行每个符号,搜索符合条件的解,可以使用递归回溯 为了便于运算,设+

Spark认识

Spark背景:在Spark出现前,要在一个平台内同时完成批处理.机器学习.流失计算.图计算.SQL查询等各种大数据分析人物,就不得不与多种独立的系统打交道,这需要系统间进行代价较大的数据转储.Spark一开始就瞄准了性能,实现了在内存中计算. 1.Spark为什么这么火?采用的编程语言有什么特点? Spark是基于内存的迭代计算框架,适用于需要多种操作特定数据集的应用场合,如pageRank.K-means等算就非常适合内存迭代计算,Spark整个生态体系正逐渐完善.Graphx.SparkS

PS基础

2013年7月,Adobe公司推出新版本photoshop——Photoshop CC(Creative Cloud).在Photoshop CS6功能的基础上,Photoshop CC新增相机防抖动功能.CameraRAW功能改进.图像提升采样.属性面板改进.Behance集成等功能,以及Creative Cloud,即云功能. 继2012年Adobe推出Photoshop CS6版本后,Adobe又在MAX大会上推出了最新版本的Photoshop CC (Creative Cloud).在主