題目:在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。例如,有乙個陣列為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時 首先...