質問を読んだ後、各変更の最小操作数を見つける方法を考えました。配列は最初は順序付けられていないため、操作数を明確に理解する方法はないので、最初に配列を並べ替えてから並べ替えます、各数値が前の数値より大きいかどうかを確認し、最小のオペランドを満たしていることを確認します。証明は次のとおりです
。A配列が順序付けられていると仮定すると、特定の数値が次の数値になる場合は、前の数値が次の数値よりも小さい必要があります。前回とは異なる番号を常に追加する必要がありますが、現時点では、後者の方が早くなりたい番号になる可能性があることを考えると、スキップした番号はもっと大きくする必要があります。したがって、上記の結果は真です:
コードは次のとおりです
public int minIncrementForUnique(int[] A) {
Arrays.sort(A);
int res=0;
for(int i=1;i<A.length;i++){
if(A[i]>A[i-1]) continue;
res=res+A[i-1]+1-A[i];
A[i]=A[i-1]+1;
}
return res;
}