原文:https://tryenough.com/1999/
問題描述:
有一個整形數組,包含正數和負數,然後要求把數組內的所有負數移至正數的左邊,且保證相對位置不變,要求時間複雜度爲O(n), 空間複雜度爲O(1)。例如,{10, -2, 5, 8, -4, 2, -3, 7, 12, -88, -23, 35}變化後是{-2, -4,-3, -88, -23,5, 8 ,10, 2, 7, 12, 35}。
解決方法
原文:https://tryenough.com/1999/
實現原理是:兩個變量記錄左右節點,兩邊分別開始遍歷。左邊的節點遇到負值繼續前進,遇到正值停止。右邊的節點正好相反。然後將左右節點的只進行交換,然後再開始遍歷直至左右節點相遇。
這種方式的時間複雜度是O(n).空間複雜度爲O(1)
以下爲java的實現:
原文:https://tryenough.com/1999/
public void setParted1(int[] a, int left, int right) {
if (left >= right || left == a.length || right == 0) {
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
return;
}
while (a[left] < 0) {
left++;
}
while (a[right] >= 0) {
right--;
}
if (left >= right || left == a.length || right == 0) {
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
return;
}
swap(a, left, right);
left++;
right--;
setParted1(a, left, right);
}
private void swap(int a[], int left, int right) {
int temp = 0;
temp = a[left];
a[left] = a[right];
a[right] = temp;
}