簡體   English   中英

Java 算法:分離奇偶數(時空復雜度)

[英]Java Algorithm: Segregate Odd Even Numbers (time-space complexity)

我正在編寫一種隔離整數數組的方法,以便所有偶數整數先於數組中的所有奇數整數。 它必須在數組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]));
}

方法 2 創建 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)和空間約束)。

做到這一點並保持相同的時間復雜度並且輸出數組的大小與輸入數組的大小相同的最簡單方法是對每個值進行模數檢查,如果它是正數,則放在前面數組,如果為負,則到后面。 請記住,您需要兩個變量才能知道正數和負數的下一個可用位置

ArrayList numberList = new ArrayList<>(Arrays.asList(1,2,3,4,5,6)); numberList.stream().filter(i -> i % 2 == 0).forEach(System.out::println);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM