javaは単純に配列中の逆順の対を実現します。
テーマの説明:
配列内の2つの数字は、前の数字が後の数字より大きい場合、この2つの数字は逆の順序でペアを構成します。行列を入力して、この配列の逆順のペアの総数Pを求めます。そしてP対100000 00007型取りの結果を出力します。即ち出力P%100000 0000 07
問題解決の考え方:
最初は霧がかかっていましたが、後には使用して並べ替えの思想を思い出しました。実はいくつかの逆順があります。つまり並べ替えの時、後の数は前のどれを超えますか?うん、あまりよくないと思います。直接コードを見ましょう。なお、問題の中では型取りの結果を出力するということは、データが非常に大きいということですので、単純に最後に型取りをするだけではデータの大きさの影響は避けられないかもしれませんので、countを更新するたびに型取りを行います。
ちょうどもう一度練習しました。並べ替えて記録してください。
配列内の2つの数字は、前の数字が後の数字より大きい場合、この2つの数字は逆の順序でペアを構成します。行列を入力して、この配列の逆順のペアの総数Pを求めます。そしてP対100000 00007型取りの結果を出力します。即ち出力P%100000 0000 07
問題解決の考え方:
最初は霧がかかっていましたが、後には使用して並べ替えの思想を思い出しました。実はいくつかの逆順があります。つまり並べ替えの時、後の数は前のどれを超えますか?うん、あまりよくないと思います。直接コードを見ましょう。なお、問題の中では型取りの結果を出力するということは、データが非常に大きいということですので、単純に最後に型取りをするだけではデータの大きさの影響は避けられないかもしれませんので、countを更新するたびに型取りを行います。
ちょうどもう一度練習しました。並べ替えて記録してください。
public class Solution {
int count;
public int InversePairs(int [] array) {
count = 0;
if(array != null){
divPairs(array, 0, array.length-1);
}
return count%1000000007;
}
public void divPairs(int[] array, int start, int end){
if(start >= end)
return;
int mid = (start + end)>>1;
divPairs(array, start, mid);
divPairs(array, mid+1, end);
mergePairs(array, start, mid, end);
}
public void mergePairs(int[] array, int start, int mid, int end){
int i = start, j = mid+1, k = 0;
int[] temp = new int[end-start+1];
while(i <= mid && j <= end){
if(array[i] <= array[j]){
temp[k++] = array[i++];
}else{
temp[k++] = array[j++];
count += mid - i + 1;
count %= 1000000007;
}
}
while(i <= mid){
temp[k++] = array[i++];
}
while(j <= end){
temp[k++] = array[j++];
}
for(int x = 0; x < temp.length; x++){
array[start+x] = temp[x];
}
}
}
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。