劍指offer 15 陣列中的逆序對

2021-10-03 21:41:43 字數 1565 閱讀 6126

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007

這是乙個歸併排序的過程,主要考慮合併兩個有序序列時,計算逆序對。

逆序對,前面數字大於後面數字,相當於研究右邊有多少比左邊當前數小。對於兩個公升序序列,設定兩個下標在左右兩個有序序列末尾。每次比較兩個末尾值,如果前末尾大於後末尾,則前末尾大於後面所有數,即逆序對數為「後面有序當前長度」個。否則不構成逆序對。然後把較大數拷貝到陣列末尾,拷貝的這個指標前移。最終要將兩個有序序列合併到輔助陣列並有序。

這樣在遞迴前,先遞迴處理左右半段,則左右有序(將有序陣列通過位址傳參傳回),且左右段逆序對可以得到。再計算左右合併過程時產生的逆序對個數。

7>5,1個逆序對,輔助陣列[5,7];6>4,1個逆序對,輔助陣列[4,6]。57(由輔助陣列返回的data值),46,p1指標在7,p2在6,7大於6,2個逆序對,7入輔助陣列,p1前移;5<6無逆序對,6入輔助陣列,p2前移;5>4,1個逆序對,5入輔助陣列。最後4入輔助陣列。最終輔助陣列[4,5,6,7],逆序對共5對。

核心**如下:

int i=r;

int p1=m;

int p2=r;

int count=0;

while(p1>=l && p2>=m+1)

while(p1>=l)

while(p2>=m+1)

1.完全正確版。將data、help通過位址傳參節省空間。遞迴呼叫時,help傳給data,data傳給help,實現交換,將help賦值給data

class solution 

long inversepairscore(vector&data,vector&help,int l,int r)

long merge(vector&data,vector&help, int l,int m,int r)

while(p1>=l)

while(p2>=m+1)

// for(i=0;i2.只傳data引數,help佔空間。最後釋放help陣列給data;

執行超時,可通過50%測試

class solution

long long inversepairscore(vector&data,int l,int r)

long long merge(vector&data,int l,int m,int r)

while(p1>=l)

while(p2>=m+1)

// for(i=0;i

help.swap(data);

//把data賦值為help;

help.end());

return count;}};

劍指offer 15陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。掃瞄陣列下標為0開始,如果當前位置的數不等於它的下標則與下表為當前元...

劍指offer全套解答 劍指offer 1 5

1.二維陣列中的查詢 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。public class solution int n array 0 length i...

劍指offer 15 反轉鍊錶

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。反轉鍊錶只需改變鏈結方向,改變方向時需要將原本指向後乙個結點的鏈結方向指向前乙個結點,因此需要記錄下三個結點。include using namespace std struct listnode class solution listnode fron...