劍指offer面試題目 陣列中的逆序對

2021-08-04 14:15:03 字數 1080 閱讀 3883

題目:在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。例如,有乙個陣列為array[0..n] 其中有元素a[i],a[j].如果 當i小於j時,a[i]>a[j],那麼我們就稱(a[i],a[j])為乙個逆序對。在陣列中一共存在5對逆序對,分別是(7,6),(7,5),(7,4),(6,4),(5,4)。

乙個比較好的思路是利用分治的思想:先求前面一半陣列的逆序數,再求後面一半陣列的逆序數,然後求前面一半陣列比後面一半陣列中大的數的個數(也就是逆序數),這三個過程加起來就是整體的逆序數目了。看這個描述,是不是有點像歸併排序呢?歸併排序的思想就是把前一段排序,後一段排序,然後再整體排序。而且,歸併排序的規程中,需要判斷前一半陣列和後一半陣列中當前數字的大小。這也就是剛剛描述的逆序的判斷過程了。如果前一半陣列的當前數字大於後一半陣列的當前數字,那麼這就是乙個逆序數。

利用歸併排序的過程中,在每一次歸併兩個陣列的時候,如果左陣列比右陣列大,那麼著就是乙個逆序。記錄所有左陣列比右陣列大的情況,就是全部的逆序數目。

#include 

#include

using

namespace

std;

typedef

long

long ll;

int n, arr[100010], tmp[100010];

//歸併排序,過程中 統計逆序數

ll merge(int start, int mid, int end)else

}while(i<=mid) tmp[k++] = arr[i++];

while(j<=end) tmp[k++] = arr[j++];

//將臨時陣列中拍好序的數,重新複製到a中

for(int i=0; ireturn cnt;

}ll inversepairs(int start, int end)

return cnt;

}int main()

return

0;}

劍指offer面試題目 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。輸入 輸入包括乙個整數n 1 n 1500 輸出 可能有多組測試資料,對於每組資料,輸出第n個醜數。方法一 最簡單的思路是,從...

劍指offer 面試題三 題目二

在乙個長度為n 1的陣列裡的所有數字都在1到n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3。我們新建乙個陣列,將陣列中的每乙個數字m,放到新陣列下標為m的位置,如果有重複,說明有重複...

《劍指offer》陣列相關面試題

在乙個長度為n的陣列裡所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複,也不知道重複了幾次,請找出陣列中任意乙個重複的數字。例如,長度為7的陣列,那麼對應的輸出應該是重複的數字2或者3.思路 重排這個陣列,從頭到尾依次掃瞄這個陣列中的每個數字。掃到下標為i的數字m時 首先...