このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。
すべて値が異なる数列Aを挿入ソートで昇順にソートする。数列Aの先頭から順に挿入先を決めて、途中に挿入することになれば、後ろに要素をずらして値を挿入する。さて、A[]というすべて値が異なる数列が与えられたときに、挿入ソートで数値をずらした回数を返すメソッドを作成せよ。
例えば、A={2,4,3,1}という数列をソートすると4という値が返されることになる。これは2、4を挿入した後に、3を挿入すると、4がずれて1回。さらに1を挿入すると、2、3、4がずれて3回ずらすことになり、全部で4回ずらすからである。
私の解答はこちら。
import java.util.ArrayList;
import java.util.Collections;
public class InsertionSortCount {
public int countMoves(int[] A) {
ArrayList<Integer> al = new ArrayList<Integer>();
int ret = 0;
for( int i=0 ; i<A.length ; i++ ){
int n = A[i];
for( int j=0 ; j<al.size() ; j++ ){
if( n < al.get(j) ){
ret += al.size()-j;
break;
}
}
al.add(n);
Collections.sort(al);
}
return ret;
}
}得点は194.01/250、中央値は約219点。毎回Collections.sortを呼ばないで、昇順でソートするTreeSetを使っても良かったかもしれない。

0 件のコメント:
コメントを投稿