我在一个网站(talentbuddy.co)上发现了这个问题,它混淆了我所知道的关于Big-O符号的一切。
以下是问题陈述:
给定一个整数数组,您的任务是打印到标准输出(stdout)初始数组,但以特殊方式排序:
所有负数首先出现,并且根据初始数组的相对位置不会改变 与正整数相同,但它们是最后的。
预期复杂性:O(N)时间,额外内存O(1)
示例输入: -5 2 1 -2 3
示例输出: -5 -2 2 1 3
我知道O(n)时间意味着算法运行时间与输入的大小成正比,在这种情况下是数组的大小,但是有多余的内存O(1)是什么意思? / p>
使用单个for循环可以解决这个问题吗?这就是我的解决方案的样子,我不确定它的运行时间是否为O(n)。
import java.util.Arrays;
class MyClass {
public static void relative_sort(Integer[] v) {
int[] positives = new int[v.length];
int counter = 0;
for(int i=0; i < v.length; i++){
if(v[i] < 0){
System.out.print(v[i] + " ");
}else{
positives[counter] = v[i];
counter++;
}
}
for(int i=0; i < counter; i++){
System.out.print(positives[i] + " ");
}
}
}
非常感谢你的帮助!我真的很感激!
答案 0 :(得分:2)
您的解决方案是O(n)
时间。在最坏的情况下,您将数组循环两次,2n
仍为O(n)
。但是,您的额外内存也是O(n)
,因为positives
数组的大小为n
,不符合O(1)
额外内存的要求。
完全抛弃positives
数组,然后简单地遍历数组两次。在第一次打印时,打印底片,在第二次打印时打印正片。这仍是2n
时间O(n)
,额外内存为O(1)
。
答案 1 :(得分:1)
额外内存约束意味着您需要使用的任何其他内存必须是常量因子。也就是说,x
的空间需要x
个字节,其中某个值不依赖于输入的大小。
当然,它提到额外的内存,因为数据的大小将与其自身成比例,因此它指的是您在阵列本身之外的操作所使用的任何额外(临时?)空间。
在您的解决方案中,您使用的数组positives
与输入数据成比例。这显然是O(n)额外的内存,因此不适合你的约束。
答案 2 :(得分:0)
虽然你可以使用两个循环,但只需摆脱正数组。而只是使用与第一个循环相似的逻辑
class MyClass {
public static void relative_sort(Integer[] v) {
for(int i=0; i < v.length; i++){
if(v[i] < 0)
System.out.print(v[i] + " ");
}
for(int i=0; i < v.length; i++){
if(v[i] >= 0)
System.out.print(v[i] + " ");
}
}
}
复杂性为O(N)
,您甚至不需要额外的常量内存O(1)