給定乙個包含正數和負數的整數陣列,重新排列它,使得所有的負數排在前面,所有的正數排在後面。正數間和負數間的相對順序保持不變。期望時間複雜度是o(n), 空間複雜度是o(1).
例如: 給定 [-1,2,-2,3,5,-4], 重新排列後變成 [-1,-2,-4,2,3,5]
分析: 1. 最簡單的演算法是o(n^2), 遇到每個負數都把它移動到陣列前面已經排列好的負數部分後面。
2. o(n)的演算法暫時沒想出來,似乎比較難,下面給出乙個o(nlogn)的演算法。基本思想類似於merge sort. 空間複雜度由於用到遞迴,是o(logn). 不過可以很容易改寫為bottom-up的迭代版本。
void main();reorder(nums, 0, nums.length-1);
}// define other methods and classes here
public void reorder(int nums, int start, int end)
int middle = start + (end-start)/2;
reorder(nums, start, middle);
reorder(nums, middle+1, end);
merge(nums, start, middle, end);
}private void merge(int nums, int start, int end)
}private void swap(int nums, int i, int j)
private void reverse(int nums, int i, int j)
}
下面是自底向上的迭代版本。空間複雜度是o(1).
public void reorder(int nums)}}
重新排列陣列 1470
題目 給你乙個陣列 nums 陣列中有 2n 個元素,按 x1,x2,xn,y1,y2,yn 的格式排列。請你將陣列按 x1,y1,x2,y2,xn,yn 格式重新排列,返回重排後的陣列。示例 1 輸入 nums 2,5,1,3,4,7 n 3 輸出 2,3,5,4,1,7 解釋 由於 x1 2,x...
不改變正負數相對順序重新排列陣列
class program posinum,neganum int index 0 int opercount 1 int maxnum 0 for int i 0 i numofnum i if math.abs inputarray i maxnum maxnum math.abs inputa...
不改變正負數相對順序重新排列陣列
看到網上乙個解法,空間複雜度o 1 時間複雜度o nlogn 做乙個小演算法題,提提神 乙個未排序整數陣列,有正負數,重新排列使負數排在正數前面,並且要求不改變原來的正負數之間相對順序。思考的過程就略去了,直接說結果吧。我想到的演算法,空間複雜度為o 1 時間複雜度為o n logn 首先,定義這樣...