给定算法的时间复杂度是多少?

时间:2020-11-05 17:19:51

标签: java algorithm data-structures

我们得到了解决这个问题的解决方案。有人可以帮助我确定给定解决方案的时间复杂度吗?应该是O(n)还是O(n ^ 2)?据我说应该是O(n)。

问题

编写一个程序以按照给定的顺序打印数组元素的总和 低于条件。

如果数组的连续顺序为6和7,则忽略6和7之间的数字,并考虑其他数字来计算总和。

Eg1)数组元素-10,3,6,1,2,7,9 O / P:22 [即10 + 3 + 9]

Eg2)数组元素-7,1,2,3,6 O / P:19

Eg3)数组元素-1,6,4,7,9 O / P:10

解决方案

outer: for (i = 0; i < elementsCount; ++i) {
            if (arr[i] == 6) {
                int sumBetweenBounds = arr[i];

                for (j = i + 1; j < elementsCount; ++j) {
                    if (arr[j] == 7) {
                        i = j;
                        continue outer;
                    }

                    sumBetweenBounds += arr[j];
                }

                sum += sumBetweenBounds;
                continue;
            }

            sum += arr[i];
        }

3 个答案:

答案 0 :(得分:7)

在谈论时间复杂度时,我们应该区分最佳情况,最坏情况或平均情况(https://en.wikipedia.org/wiki/Best,_worst_and_average_case)。如果没有提及,通常是最坏的情况。

在最坏的情况下,由于数组元素为6时内部循环运行,因此算法为O(n ^ 2)。在最坏的情况下,所有数组元素都可能是该值。

在最佳情况下,它是O(n),但这通常并不有趣。

对于平均情况分析,您需要知道算法将在其上运行的所有数组中的值分布。

答案 1 :(得分:2)

首先,您的算法将不适用于仅6的数组。

第二,您的算法复杂度为O(n ^ 2),请检查仅6的数组的情况。

如果只有6,那么您将继续进入每个元素的内部循环,这将为您提供所提到的复杂性,并且还继续汇总您之前已总结的6。

例如:

int[] arr = new int[]{6,6,6,6};

将给出:

//1st iteration
sum += 6+6+6+6;
//2nd iteration
sum += 6+6+6;
//3rd
sum += 6+6;
//4th
sum += 6;

总共给出sum=60而不是24。

答案 2 :(得分:0)

您要使解决方案变得更加复杂而不是实际存在的问题,应该使用single for循环,并且可以使用boolean来检查是否要添加元素的天气