Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从阵列中寻找三角形_C++ - Fatal编程技术网

C++ 从阵列中寻找三角形

C++ 从阵列中寻找三角形,c++,C++,给出了由N个整数组成的零索引数组。三元组P,Q,R是三角形的if和 A[P] + A[Q] > A[R], A[Q] + A[R] > A[P], A[R] + A[P] > A[Q]. 例如,考虑数组A,使 A[0] = 10 A[1] = 2 A[2] = 5 A[3] = 1 A[4] = 8 A[5] = 20 三元组0,2,4是三角形的。 写一个函数 int triangle(const vector<int> &am

给出了由N个整数组成的零索引数组。三元组P,Q,R是三角形的if和

A[P] + A[Q] > A[R], 
A[Q] + A[R] > A[P], 
A[R] + A[P] > A[Q]. 

例如,考虑数组A,使

A[0] = 10    A[1] = 2    A[2] =  5
A[3] =  1    A[4] = 8    A[5] = 20
三元组0,2,4是三角形的。 写一个函数

int triangle(const vector<int> &A);
给定一个由N个整数组成的零索引数组,如果该数组存在三角形三元组,则返回1,否则返回0

假设:

N是[0..100000]范围内的整数; 数组A的每个元素都是[-2147483648..2147483647]范围内的整数。 例如,给定一个数组

A[0] = 10    A[1] = 2    A[2] =  5
A[3] =  1    A[4] = 8    A[5] = 20
A[0]=10A[1]=2A[2]=5 A[3]=1A[4]=8A[5]=20 如上所述,函数应返回1。给定一个数组,使得 A[0]=10A[1]=50A[2]=5 A[3]=1 函数应返回0。 预期最坏情况时间复杂度:
预计最坏情况下的空间复杂度:O1

排序将非常酷,但const vector和O1空间要求不允许这样做

因为这是一些提示:三角形数字彼此接近。

如果ON³的时间复杂度可以接受,那么下面的伪代码应该可以工作。如果您有更严格的时间复杂度要求,那么您必须指定它们

for (P in A){
    for (Q in A){
        for (R in A){
            if(A[P] > 0 && A[Q] > 0 && A[R] > 0){
                if(A[P] > A[R] - A[Q] && A[Q] > A[P] - A[R] && A[R] > A[Q] - A[P]){
                    return 1;
                }
            }
        }
    }
}
return 0;
if语句背后的理由如下:

因为整数可以是最大整数,所以必须处理溢出。如果数组中有两个非常大的整数,将它们相加可能会导致一个奇怪的错误。因此,我们测试它们是否为正,然后重写公式以进行相同的检查,但使用减法。如果任何值为负值或0,我们无需执行任何操作,因为:

Assume x <= 0
Assume x+y > z
Assume x+z > y
Then y > z and z > y which is a contradiction

因此,三元组中不会有负值或零值整数。提示:如果只选择数组的两个成员,那么三角形三元组的第三个成员的可能值有什么限制?任何超出这些限制的数字都可以立即被拒绝。

有许多现成的分类;使用其中一个对数组进行排序-例如,对较小的数组进行梳状排序^2上的时间复杂度或对logN上的堆排序复杂度

对数组进行排序后,问题应该是是否有一组3个数字,其中a[X]>a[X-1]+a[X+1]/2,即中间数字大于前后数字的平均值。遗憾的是,这是一个猜测,我没有真正的基础-如果它不正确,我希望有人纠正我,但是应该有一些好的方法来重新定义“三角形”要求,以便更容易检查

现在,您只需对排序数组进行O1迭代,以检查条件是否为真,因此总体复杂度将是排序算法的最佳情况N logN

首先,没有必要考虑非正数。如果至少有一个数字是负数或零,就不可能得到三角形不等式。这是显而易见的,但证据如下:

假设A,B,C服从三角形不等式,而cb。因此A>B。 B+C>A。因此B>A。 矛盾

第二索赔

假设A,B,C服从三角形不等式,而C是A,B,C中最大的。那么对于A,B和C之间的每个A2和B2,它们也将服从三角形不等式

换言之:

A、 B,C服从三角形不等式。 C>=A C>=B C>=A2>=A C>=B2>=B 那么A2,B2,C也服从三角形不等式。 证明很简单,足以明确写出不等式

这样做的结果是,如果C是你想要找到三角形不等式的最大数,你应该只检查集合中不超过C的两个最大数,并且检查A+B>C

第三索赔

如果0 上述算法在最大整数大小中是对数的。换句话说,它在数据类型位上是线性的。它的最坏情况复杂性与输入长度无关。因此,输入长度为O1

证明:


在每次没有找到解决方案的迭代中,我们都有一个类似于家庭作业的问题。到目前为止你在哪里?实际上,这是家庭作业!我本来打算对它进行排序,但由于0违反空间限制。完全没有考虑到它是一个常量向量,排序会容易得多:数字1、5和8会失败。5>4.5,为8+1/2,但1+5<8。大ints+1处理良好。测试不应该是连接而不是分离吗?@Jiri,是的,你是对的,那是个错误。我现在编辑了它。一个long是否保证长度为32位?如果是这样的话,我会使用long来进行不平等性比较,因为这是一个家庭作业,不需要效率。我也不明白你的小证明;第二个和第三个假设的动机是什么?为什么这个矛盾告诉我们,如果任何值为负值或0,我们不需要做任何事情。事实上,我有一个反例来证明你的说法:如果数组有一个负数,函数需要返回一个值或0或1,因此函数需要做一些事情。好的,我现在就知道了。你证明了如果一个元素是非正的,那么它就不可能是三角形三元组的一部分,这证明了你的代码中的“ifA[P]>0&&a[Q]>0&&a[R]>0”部分是正确的。但我不会说我们不需要做任何事情。@DavidGrayson我的意思是,在循环中不需要对负值进行任何特殊处理。第2步是线性搜索,除非您可以对数组进行预排序,因为它正在查看所有其他项。@Dave s:是的,我的意思是算法的复杂性已启用。对不起,数据类型位是什么意思?