![](/img/trans.png)
[英]Create a 2D array and initialize every element to be the value of i * j where i and j are the 2 indices (for instance, element [5][3] is 5 * 3 = 15)
[英]Java: Sum of 2D array where the M[i][j] = (int) i/j
T-测试用例数| 1 <= T <= 10和n-元素数| 1 <= n <= 1000000
例如
if (T >= 1 && T <= 10) {
for (int i = 0; i < T; i++) {
int n = sc.nextInt();
if (n > 0 && n <= 1000000) {
array = new int[n][n];
System.out.print("\n" + sumOfArray(array, n));
}
}
}
需要找出M [i] [j]的总和,其中M [i] [j] =(int)i / j;
我已经编写了代码,但是对于n> 10000,我开始获得OOM(出于明显的原因)。
如果有人可以帮助我,那就太好了。 需要一种全新的方法来解决问题。
例如。
Input Output
2
2 4
4 17
在这里很明显,您不需要将值存储在矩阵中,因为不可能分配那么多的空间( Array[10000][10000]
)。 因此,您需要以mathematical
方式进行思考。
考虑一个4x4
矩阵,并表示i,j
项中的每个元素。
1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4
现在我们可以在这里表示存储在每个元素中的内容。
1/1 1/2 1/3 1/4 (In Integers) 1 0 0 0
2/1 2/2 2/3 2/4 ============> 2 1 0 0
3/1 3/2 3/3 3/4 3 1 1 0
4/1 4/2 4/3 4/4 4 2 1 1
通过将矩阵划分为多个列来解决该矩阵,并求解每个columns
。 对于第一列,序列将为1+2+3+4
然后对于第二列two(2)
,序列将为0+1+1+2
。
请注意,在ith
列中, first
i-1
值为零,然后在该列中i values
相同。 然后增加value
。 同样,对于i
值也将是相同的。 再次增加1
,依此类推。
因此,在ith
列中, jth
元素的值会increased
,其中j%i==0
。
因此,您可以在1-D
数组中实现此逻辑,并且对于每个测试用例,此方法的复杂度将为O(n logn)
。
码:
import java.util.Scanner;
public class Main
{
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
int testcases=sc.nextInt();
while(testcases-- >0)
{
int n=sc.nextInt();
long array[]=new long[n+1]; //Take long array to avoid overflow
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j+=i)
{
array[j]++; //This will store that which elements get increased
//from zero how many times
}
}
//Now we can do summation of all elements of array but we need to do prefix sum here
long sum=0;
for(int i=1;i<=n;i++)
{
array[i]+=array[i-1];
sum+=array[i];
}
System.out.println(sum);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.