不改變正負數相對順序重新排列陣列

2021-06-09 13:32:43 字數 1688 閱讀 7528

看到網上乙個解法,空間複雜度o(1),時間複雜度o(nlogn)

做乙個小演算法題,提提神

乙個未排序整數陣列,有正負數,重新排列使負數排在正數前面,並且要求不改變原來的正負數之間相對順序。

思考的過程就略去了,直接說結果吧。我想到的演算法,空間複雜度為o(1),時間複雜度為o(n*logn)。

首先,定義這樣乙個過程為「翻轉」:(a1,a2,...,am,b1,b2,...,bn) --> (b1,b2,...,bn,a1,a2,...,am)。其次,對於待處理的未排序整數陣列,從頭到尾進行掃瞄,尋找(正正...正負...負負)串;每找到這樣乙個串,則計數器加1;若計數為奇數,則對當前串做乙個「翻轉」;反覆掃瞄,直到再也找不到(正正...正負...負負)串。

舉例如下

input   :  1, -1,   2, -2,  3, -3,  4, -4,   5, -5,  6, -6,  7, -7,  8, -8

step1.1: [1, -1], 2, -2, [3, -3], 4, -4, [5, -5], 6, -6, [7, -7], 8, -8

step1.2: [-1, 1], 2, -2, [-3, 3], 4, -4, [-5, 5], 6, -6, [-7, 7], 8, -8

step2.1: -1, [1, 2, -2, -3], 3, 4, -4, -5, [5, 6, -6, -7], 7, 8, -8

step2.2: -1, [-2, -3, 1, 2], 3, 4, -4, -5, [-6, -7, 5, 6], 7, 8, -8

step3.1: -1, -2, -3, [1, 2, 3, 4, -4, -5, -6, -7], 5, 6, 7, 8, -8

step3.2: -1, -2, -3, [-4, -5, -6, -7, 1, 2, 3, 4], 5, 6, 7, 8, -8

step4.1: -1, -2, -3, -4, -5, -6, -7, [1, 2, 3, 4, 5, 6, 7, 8, -8]

step4.2: -1, -2, -3, -4, -5, -6, -7, [-8, 1, 2, 3, 4, 5, 6, 7, 8]

output: -1, -2, -3, -4, -5, -6, -7,  -8, 1, 2, 3, 4, 5, 6, 7, 8

證明如下

先計算「翻轉」的時間複雜度。

將(a1,a2,...,am,b1,b2,...,bn) 翻轉為 (b1,b2,...,bn,a1,a2,...,am),只要三步:

(a1,a2,...,am,b1,b2,...,bn) -->

(bn,...,b2,b1,am,...,a2,a1) -->

(b1,b2,...,bn,am,...,a2,a1) -->

(b1,b2,...,bn,a1,a2,...,am)

總的來說,時間複雜度為o(2m+2n)

對於長度為n的數串來說,任選其中若干個互不重疊的子串進行翻轉,總的時間複雜度不會超過o(n)。

接下來的問題,是「掃瞄」進行了多少次。

因為每次掃瞄只是翻轉不相鄰的(正正...正負...負負)串,因此所有被翻轉的串,從正負數分界處被分為兩部分,分別歸入前後兩個相鄰的(正正...正負...負負)串。因此,每趟掃瞄能消滅一半的(正正...正負...負負)串。最終,總共需要掃瞄的次數最多為logn。

綜上,時間複雜度為o(n*logn)。

當然這個詳細介紹可以看:

不改變正負數相對順序重新排列陣列

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...

大數相加(分正負數)

給出2個大整數a,b,計算a b的結果。input 第1行 大數a 第2行 大數b a,b的長度 10000 需注意 a b有可能為負數 output 輸出a b sample input68932147586 468711654886sample output537643802472 includ...

不改變相對順序,負數左邊正數右邊

不改變正負數之間的相對順序重新排列陣列,使得負數字於正數之前 1 舉例 如 1,7,5,2,9,3變成 5,9,1,7,2,3 2 方法一 從頭到尾掃瞄陣列,每次碰到乙個正數時,就把位於這個數字之後的所有數字到往前挪動一位。挪動之後在陣列的末尾有乙個空位,把這個正數填進去。整體的時間複雜度為o n ...