我们得到了解决这个问题的解决方案。有人可以帮助我确定给定解决方案的时间复杂度吗?应该是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];
}
答案 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来检查是否要添加元素的天气