劍指offer題解 陣列中的逆序對

2021-07-14 02:31:29 字數 1455 閱讀 9695

題目描述

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。

劍指offer解法,還未理解

public

class solution

return inversepairsnum(array,copy,0,copy.length-1);

}int inversepairsnum(int array,int copy,int start,int

end)

int length=(end-start)/2;

intleft=inversepairsnum(copy,array,start,start+length);

intright=inversepairsnum(copy,array,start+length+1,end);

int pos=end;

int i=start+length;

int j=end;

int count=0;

while(i>=start&&j>=start+length+1)else

}while(i>=start)

while(j>=start+length+1)

return left+right+count;

}}

另一種解法,容易理解

class solution 

int mergesort(vector

& data, int start, int end)

// 遞迴

int mid = (start + end) / 2;

int leftcounts = mergesort(data, start, mid);

int rightcounts = mergesort(data, mid+1, end);

// 歸併排序,並計算本次逆序對數

vector

copy(data); // 陣列副本,用於歸併排序

int foreidx = mid; // 前半部分的指標

int backidx = end; // 後半部分的指標

int counts = 0; // 記錄本次逆序對數

int idxcopy = end; // 輔助陣列的下標

while(foreidx>=start && backidx >= mid+1) else

}while(foreidx >= start)

while(backidx >= mid+1)

for(int i=start; i<=end; i++)

return (leftcounts+rightcounts+counts);

}};

劍指offer題解 陣列中重複的數字

碼上生花,echarts 作品展示賽正式啟動!在乙個長度為 n 的陣列裡的所有數字都在 0 到 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的,也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。input output 2要求時間複雜度 o n 空間複雜度 o 1 因此...

劍指offer 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。解法一 乙個數字能不能構成逆序對,關鍵看後面有幾個比他小的數字。根據這個思路,我們可以從後向前遍歷整個陣列。並用乙個大小為10的陣列,分別來儲存從後向前遍歷陣列時0 9每個數字...

劍指offer 陣列中的逆序對

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。class solution vector tmp len int res mergesort data,tmp,0,len 1 return res private...