Java 算法 : Segregate Odd Even Numbers (time-space complexity)

标签 java algorithm

我正在编写一个方法来隔离整数数组,以便所有偶数整数都在数组中的所有奇数整数之前。它必须在数组 O(n) 的大小上花费线性时间,并且只需要恒定数量的额外空间就地运行。

输入:{2, 4, 7, 6, 1, 3, 5, 4}
输出:2, 4, 6, 4, 7, 1, 3, 5

输入:{5, 12, 3, 21, 8, 7, 19, 102, 201}
输出:12、8、102、5、3、21、7、19、201

这些是我的解决方案:

private static void segregateArray1(final int[] arr) {
    if (arr != null) {
        int leftIdx = 0;
        int rightIdx = arr.length - 1;

        while (leftIdx < rightIdx) {
            if (arr[leftIdx] % 2 != 0 && arr[rightIdx] % 2 == 0) {
                // swap immediately
                int temp = arr[leftIdx];
                arr[leftIdx] = arr[rightIdx];
                arr[rightIdx] = temp;
                leftIdx++;
                rightIdx--;
            } else {
                if (arr[leftIdx] % 2 == 0) {
                    leftIdx++;
                }
                if (arr[rightIdx] % 2 == 1) {
                    rightIdx--;
                }
            }
        }
    }
}

方法一耗时O(n),不占用额外空间。但是,它不维持秩序。

private static int[] segregateArray2(final int[] arr) {
    List<Integer> evenArr = new ArrayList<Integer>();
    List<Integer> oddArr = new ArrayList<Integer>();

    for (int i : arr) {
        if (i % 2 == 0) {
            evenArr.add(i);
        } else {
            oddArr.add(i);
        }
    }
    evenArr.addAll(oddArr);

    return ArrayUtils.toPrimitive(evenArr.toArray(new Integer[0]));
}

方法二创建ArrayList。我不确定这是否也是 O(n)。

测试:

public static void main(String[] args) {
    int[] arr = {2, 4, 7, 6, 1, 3, 5, 4};
    segregateArray1(arr);
    System.out.println(Arrays.toString(arr));

    int[] arr = {2, 4, 7, 6, 1, 3, 5, 4};
    // creates another array segragatedArr!
    int[] segragatedArr = segregateArray2(arr);
    System.out.println(Arrays.toString(segragatedArr));
}

我不确定是否有满足时空复杂度(O(n) 和空间限制)的更简洁的解决方案/简单性。

最佳答案

执行此操作并保持相同的时间复杂度以及输出数组的大小与输入数组的大小相同的最简单方法是对每个值进行模数检查,如果它是正数则放置到数组的前面,如果是负数则返回数组的后面。请记住,您将需要两个变量来了解正数和负数的下一个可用位置

关于Java 算法 : Segregate Odd Even Numbers (time-space complexity),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36843250/

相关文章:

java - 为什么我的文件没有下载 (HTMLUnit) Java

java - 从一组包含项目的数组中获取最佳组合

algorithm - 贪婪将如何在这个硬币找零的案例中发挥作用

java - 将 Java 网站部署到 AWS Elastic Beanstalk

java 。无法在 JScrollPane 中添加 JPanel

java - AWS Elastic Map Reduce 中线程 "main"java.lang.NoClassDefFoundError 中的异常

java - 如何遍历图表?

java - Camel可以从java对象生成文件吗

java - 时间复杂度 : why O(nlogn)?

algorithm - 枚举加权图中从A到B的所有路径,其中路径长度在C1和C2之间