下面是重新排序奇数后跟偶数的代码片段,而不改变原始数组中偶数/奇数的顺序。
输入 - {1,4,8,3,9,12,7} 输出 - {1,3,9,7,4,8,12}
我们可以从空间中的O(n2)改善这一点(不使用额外的空间)吗?
public static void reOrder(int[] arr) {
int evenIndex = arr.length;
for(int i=0; i < arr.length;i++) {
if(arr[i] % 2 == 0 && evenIndex == arr.length) //even index
evenIndex = i;
else if( arr[i] % 2 != 0 ) {
if(i > evenIndex ) {
shift (arr, evenIndex , i);
evenIndex ++;
}
}
}
}
static void shift(int[] arr, int evenIndex, int endIndex) {
int temp = arr[endIndex];
for(int i = endIndex; i > evenIndex ;i --) {
arr[i] = arr[i-1];
}
arr[evenIndex] = temp;
}
答案 0 :(得分:0)
您没有指定任何语言标记,因此我将使用python回答(因为我现在使用它的速度更快)。
如果您仅关心空间复杂性,您可以执行以下操作:
l = [1, 4, 8, 3, 9, 12, 7]
even_index = -1
for index in range(0, len(l)):
if (l[index] % 2) == 0:
if even_index == -1:
even_index = index
else:
if (index > 0) and (even_index > -1):
num = l[index]
l.insert(even_index, num)
del l[index + 1]
even_index += 1
print(l)
您保留第一个偶数的位置索引,并在找到它们时通过列表插入奇数。然后你删除了#34; old&#34; index(现在增加1)。
我认为空间复杂性是您所需要的,但时间复杂性可以得到改善。
例如,在Python中,collections.deque
在这种情况下可能更好,但时间复杂度不是优先事项。