タイトル説明
整数Aの配列を指定し、任意の操作を選択し[i]を各Aを移動させ、その1をインクリメントします。
操作の最小数のそれぞれの戻り値は一意です。
思考
- 暴力ソリューション:配列によるバックにフロントハッシュを使用したが表示されますが、番号が最初に現れるまで、デジタル++ 0ではないことを現在の数の数を数えます。配列の長さの値を考慮し、以下40,000、配列BEハッシュ80,000サイズは(極端な場合を考えると、すべての数は40,000です)
- 数== 1数のカウント++、Rもし現在番号<前の数、カウント+ = A [I-1] + 1-A [I]、A [i]の前に現在の場合、最初は、ソートした後、最初から最後までトラバース= A [I-1] +1
- ソートカウント:最大値が配列中に見出されている間反復する、ハッシュ統計の数を使用して、表示されます。また、マルチパートカウントを添加しながら、ハッシュアレイトラバーサルは、ハッシュ[I]> 1の場合、次に、上のマルチパート[I 1 +]ハッシュに適用されます。最後に、一部のハッシュを忘れないでください[最大+ 1] 1も前進必要以上の
コード
この方法の一つ:
class Solution {
public:
int minIncrementForUnique(vector<int>& A) {
if(A.size() < 2)
return 0;
vector<int> Hash(80000);
int count = 0;
for(int i = 0; i < A.size();i++)
{
if (Hash[A[i]] == 0)
Hash[A[i]]++;
else
{
int k = A[i];
while (Hash[k] != 0 && k<80001)
{
count++;
k++;
}
Hash[k]++;
}
}
return count;
}
};
方法2:
class Solution {
public:
int minIncrementForUnique(vector<int>& A) {
if(A.size() < 2)
return 0;
sort(A.begin(),A.end());
int count = 0;
for(int i = 1; i < A.size();i++)
{
if(A[i] == A[i-1])
{
count++;
A[i]++;
}
else if(A[i] < A[i-1])
{
count += A[i-1] + 1 - A[i];
A[i] = A[i-1]+1;
}
}
return count;
}
};
方法3:
class Solution {
public:
int minIncrementForUnique(vector<int>& A) {
if(A.size() < 2)
return 0;
int res = 0;
int max = -1;
vector<int> Hash(40000,0);
for(int i = 0 ; i < A.size(); i++)
{
Hash[A[i]]++;
if(A[i]>max) max = A[i];
}
for(int i = 0; i <= max;i++)
{
if(Hash[i] > 1)
{
int d = Hash[i] - 1;
Hash[i+1] += d;
res += d;
}
}
int d = Hash[max+1]-1;
res = res + d*(1+d)/2;
return res;
}
};