題目描述
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。
劍指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...