所以我一直在做一个赋值问题几天,现在我发现很难让这个程序在线性时间运行。我已经在O(n^2)中工作,但我想获得一个完美的分数。如何让这个程序在线性时间运行?
这里是问题: 我们被要求将某些数字的副本更改为负数,然后将所有副本发送到数组的末尾。
For example, if the input array is [ 4 , 1 , 1 , 3 , 3 , 3 , 1 , 1 ], it
reads [ 4 , 1 , 3 , 1 , -1 , -1 , -1 , -1 ] after squeeze() completes.
这里是我的程序:
int base = ints[ints.length -1];
int count = 0;
for (int i = ints.length - 1 ; i > 0 ; i--)
{
if (base == ints[i-1])
{
ints[i] = N_ONE;
count++;
} else {
base = ints[i-1];
}
}
int count2 = 0;
for (int j = 0; (count) != count2 ; j++)
{
if (ints[j] == -1 && ints[j+1] != -1)
{
ints[j] = ints[j+1];
ints[j+1] = N_ONE;
count2 = 0;
j = 0;
} else if (ints[j] == -1 && ints[j+1] == -1){
count2++;
}
}
}
我的第一个循环有效运作,并将它设置所有的重复数为-1的,但是不仅是我的第二循环不在直线运行,但是我觉得它可以用更简单的方式完成。我试过用手写出过程,但我似乎仍然只想出O(n^2)的方法。
有没有人有任何建议或提示?有没有真正简单的我失踪?
在此先感谢!
在一次通过中,使用索引为每个阅读的地方和您正在书写的地方进行。只能写一次读取重复数据块。当读完元素时,只需用-1填充数组的其余部分即可。 –
要在_O(n)_时间查找重复项,请使用'HashSet'。 –
Andreas