【发布时间】:2017-02-02 12:01:21
【问题描述】:
所以我这几天一直在处理一个作业问题,我发现让这个程序在线性时间内运行非常困难。我已经让它在 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<Integer>。
标签: java arrays loops runtime computer-science