Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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
Java 有多少种方法不能形成三角形?_Java_Algorithm_Performance_Time_Time Limiting - Fatal编程技术网

Java 有多少种方法不能形成三角形?

Java 有多少种方法不能形成三角形?,java,algorithm,performance,time,time-limiting,Java,Algorithm,Performance,Time,Time Limiting,给定n个正整数和n个正整数的数组,需要多种方法来选择三个数字,使它们不能形成三角形 例如: 3 4 2 10 答复: 1 我的JAVA方法 我的算法: 在对列表进行排序之后,我试图找到小于arr[I]的所有数字,以便arr[I]>=arr[j]+arr[k],在这种情况下,三角形不会形成 但是这个解决方案让我超时了。有谁能提出一个更好的解决这个问题的方法吗?合适的伪代码是: SORT array //nlogn INT counter = n*(n-1)*(n-2)/6; FOR i =

给定n个正整数和n个正整数的数组,需要多种方法来选择三个数字,使它们不能形成三角形

例如:

3  
4 2 10
答复:

1
我的JAVA方法

我的算法:

在对列表进行排序之后,我试图找到小于arr[I]的所有数字,以便arr[I]>=arr[j]+arr[k],在这种情况下,三角形不会形成


但是这个解决方案让我超时了。有谁能提出一个更好的解决这个问题的方法吗?

合适的伪代码是:

SORT array //nlogn
INT counter = n*(n-1)*(n-2)/6;
FOR i = n - 1; i >= 2; i-- DO //largest length in a triangle - there must be two lower
    currentLargestNumber = array[i];
    FOR j = i - 1; j >= 1; j-- DO
        BINARY SEARCH FOR SMALLEST k for which array[k] + array[j] > array[i]
        counter -= j - k;
        IF nothingAddedInTheLastIteration DO
            BREAK;
        END_IF
    END_FOR
    IF nothingAddedInTheLastIteration DO
        BREAK;
    END_IF
END_FOR
我假设不会有超过3个相同值的输入。如果存在这种可能性,请删除不必要的值


在每个循环中,您应该检查是否添加了任何三角形。如果没有,请中断此循环。

相应的伪代码为:

SORT array //nlogn
INT counter = n*(n-1)*(n-2)/6;
FOR i = n - 1; i >= 2; i-- DO //largest length in a triangle - there must be two lower
    currentLargestNumber = array[i];
    FOR j = i - 1; j >= 1; j-- DO
        BINARY SEARCH FOR SMALLEST k for which array[k] + array[j] > array[i]
        counter -= j - k;
        IF nothingAddedInTheLastIteration DO
            BREAK;
        END_IF
    END_FOR
    IF nothingAddedInTheLastIteration DO
        BREAK;
    END_IF
END_FOR
我假设不会有超过3个相同值的输入。如果存在这种可能性,请删除不必要的值


在每个循环中,您应该检查是否添加了任何三角形。如果没有,就打破这个循环。

这个问题可以用双指针技术解决,但我们将不计算有多少三元组不能形成三角形,而是寻找相反的结果,最后从Cn中减去结果,3=nn-1n-2/6。让我们对数组arr进行排序,arr[0]j,s.t.arr[i]+arr[j]arr[k-1]。这将导致额外的k-j-1三元组三元组是:{i,j,j+1},{i,j,j+2},…,{i,j,k-1}。现在请注意,无论何时增加j,都不需要重置k的值,这有助于将总时间复杂度保持在^2


这个问题可以用双指针技术来解决,但我们不需要计算有多少个三元组不能形成三角形,我们将寻找相反的结果,最后从Cn中减去结果,3=nn-1n-2/6。让我们对数组arr进行排序,arr[0]j,s.t.arr[i]+arr[j]arr[k-1]。这将导致额外的k-j-1三元组三元组是:{i,j,j+1},{i,j,j+2},…,{i,j,k-1}。现在请注意,无论何时增加j,都不需要重置k的值,这有助于将总时间复杂度保持在^2


我不太确定我是否理解您正在使用的算法,所以您可以详细说明一下。此外,您不需要while循环中的第二个条件,即代替ifcondition{}else if!条件{}只需使用ifcondition{}else{}。是的……我添加了ifcondition{}else if!为了更好地理解……提示:如果您要使用有意义的名称,而不是n、arr、count等等。。。并对算法应该如何运行提出了一些意见;也许其他人会明白你在做什么。或者至少,他们会有机会。。。你看,代码的思想是:人类阅读代码的频率比编写代码的频率高很多倍。因此,您希望真正专注于编写易于阅读和理解的代码。@GhostCat为了清晰起见,我添加了注释…..:。。。我喜欢用较短的名字打字。我试过的算法现在清楚了吗……?对于^2上的大n来说,这是一个有点沉重的算法,如果第一眼看到的话,但是,我看不出你能做得更好。不过,我从未听说过在这种情况下会超时,因此您可能希望更准确地解释您看到的内容,可能会逐字引用错误消息。PS用于理解我更喜欢的if-else断言!条件作为else部分的第一句话,我不太确定我是否理解您使用的算法,所以您可以详细说明一下。此外,您不需要while循环中的第二个条件,即代替ifcondition{}else if!条件{}只需使用ifcondition{}else{}。是的……我添加了ifcondition{}else if!为了更好地理解……提示:如果您要使用有意义的名称,而不是n、arr、count等等。。。并对算法应该如何运行提出了一些意见;也许其他人会明白你在做什么。或者至少,他们会有机会。。。你看,代码的思想是:人类阅读代码的频率比编写代码的频率高很多倍。因此,您希望真正专注于编写易于阅读和理解的代码。@GhostCat为了清晰起见,我添加了注释…..:。。。我喜欢用较短的名字打字。我试过的算法现在清楚了吗……?对于^2上的大n来说,这是一个有点沉重的算法,如果第一眼看到的话,但是,我看不出你能做得更好。不过,我从未听说过在这种情况下会超时,因此您可能希望更准确地解释您看到的内容,可能会逐字引用错误消息。PS用于理解我更喜欢的if-else断言!条件作为else部分的第一句话,它是一种相同的算法……我想……你能详细说明一下,让我能理解其中的区别……主要的区别是
是二进制搜索-它降低了时间复杂度。@OleV.V。另外,中断考虑应该会加快。无需进行二进制搜索,可以从上次搜索中保留k和j的值。看看我的答案。这是一种相同的算法……我想……您能详细说明一下,以便我理解其中的区别吗……?主要区别在于二进制搜索—它降低了时间复杂度。@OleV.V。另外,中断考虑应该会加快。无需进行二进制搜索,可以从上次搜索中保留k和j的值。看看我的答案。干杯
//arr is already sorted
long triangles = 0;
for(int i = 0; i < n-2; i++){
   int k = i + 2;
   for(int j = i + 1; j < n; j++){
      while(arr[i] + arr[j] > arr[k] && k < n){
         k++;
      }
      triangles += k-j-1;
   }
} 
long answer = n*(n-1)*(n-2)/6 - triangles;