int[][] A = new int [n][];
for (int i=0; i<n; i++) {
if (i % 2 == 0) // i is a multiple of 2
A[i] = new int [n];
else
A[i] = new int [1];
}
for (int i=0; i<A.length; i++)
for (int j=0; j<A[i].length; j++)
sum = sum + A[i][j];
所以我对阵列的作用感到有些困惑。第一行初始化具有n列的2D数组。第一个for循环查看每列。如果它是偶数列,则将n放在该列的第一行中。现在我对此感到有点困惑,因为即使它应该是一个2D数组,它只被引用一个括号。 double for循环也是如此。 A.length和A [i] .length之间有什么区别?根据我的理解,double for循环遍历数组并获得所有元素的总和。有人可以澄清一下,因为我在语法上有点迷失。
另外,我的直觉说这个代码至少在O(n ^ 2)时间运行,因为for循环是双重的。这看起来是对的吗?
答案 0 :(得分:1)
如果你认为A不是一个二维数组(我们通常认为是矩形),而是一个整数数组的数组,它可能会有所帮助。外部数组包含n个int数组,每个数组的大小可能不同。
A[i] = new int [n]
实际上做的是在数组A的第i个元素中放置一个大小为n的数组。A[i].length
是存储在A中位置i的数组的长度。
你对O(n ^ 2)和嵌套for循环的直觉在这里通常是正确的。
答案 1 :(得分:0)
看起来你的算法不完整。
顶部初始化一个2D数组,使得每个偶数顶级数组元素的长度为n,每个奇数顶级数组元素的长度为1。
在下半部分,外部循环遍历所有顶级元素。有这样的元素。对于每个元素,内部for循环对子元素求和。这些元素中有n个和1个交替。
如果这是Java,那么默认情况下每个int []数组元素的内容都是0.如果是,那么最后的总和将是0.你将花费O(n *(n / 2 +) n))= O(n ^ 2)得到答案。