java - 在 O(1) 空间和 O(n) 时间中重新排序的 boolean 数组

标签 java arrays algorithm

问题出自Elements of Programming Interviews :

给定一个包含 boolean 值键的 n 个对象的数组 A,重新排序数组,使键为 false 的对象首先出现。 键为 true 的对象的相对顺序不应改变。 使用 O(1) 额外空间和 O(n) 时间。

我做了以下操作,它保留了键为 true 的对象的相对顺序并使用了 O(1) 额外空间,但我相信它的时间复杂度是 O(n*n!)。

public static void rearrangeVariant4(Boolean[] a) {
  int lastFalseIdx = 0;
  for (int i = 0; i < a.length; i++) {
    if (a[i].equals(false)) {
      int falseIdx = i;
      while (falseIdx > lastFalseIdx) {
        swap(a, falseIdx, falseIdx-1);
        falseIdx--;
      }
      lastFalseIdx++;
    }
  }
}

有人知道如何在 O(n) 时间内解决它吗?

最佳答案

boolean array[n]; // The array
int lastTrue = n;
for (int i = n-1; i >= 0; --i) {
  if (array[i]) {
    swap(array[--lastTrue], array[i]);
  }
}

在每次迭代之后,lastTrue 之后的所有元素都为真。没有两个真正的元素被交换,因为如果在 ilastTrue 之间有一个真正的元素,它就会已经遇到并移到 lastTrue 后面。这在 O(n) 时间和 O(1) 内存中运行。

关于java - 在 O(1) 空间和 O(n) 时间中重新排序的 boolean 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29723998/

相关文章:

javascript - 根据键是否存在和值对对象数组进行排序

ios - 将多个数组相加形成一个最终数组。调试问题,Swift Xcode

java - 从对象数组中删除对象

python - 根据字符将 Python 字符串列表拆分为单独的列表

c - Sum (i...j) - 是否有更有效/更优雅的解决方案?

algorithm - 如何将特定行设置为一并将所有其他行设置为零?

java - 如何将 PyObject 转换为 java boolean 类型

java - 使用 viewPager 滚动所有布局

java - 如何在 Hadoop Mapreduce 中处理两个文件?

java - Core Java/JSF/Servlet 中状态模式的示例是什么?