128.最長の連続シーケンス
ソートされていない整数配列numsが与えられた場合、数値の最長の連続シーケンスの長さを見つけます(シーケンス要素は元の配列で連続している必要はありません)。
高度:時間計算量がO(n)のソリューションを設計および実装できますか?
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
提示:
0 <= nums.length <= 104
-109 <= nums[i] <= 109
回答:
方法1:ソートソリューション
並べ替え関数を使用して配列を並べ替えるという考え方です。連続している場合は、簡単に見つけることができます。2を引いて1にすると、一致しない場合はこのセグメントが見つかったはずなので、探し始めます。次のセグメントのために。最後に、最長の出力を比較します。
コード:
int max(int x,int y)
{
return x>y?x:y;
}
int cmp(int*x,int*y)
{
return *x>*y;
}
int longestConsecutive(int* nums, int numsSize){
if(numsSize==0)
return 0;
qsort(nums,numsSize,sizeof(int),cmp);
int length = 1;
int temp = INT_MIN;
for(int i=1;i<numsSize;i++)
{
if(nums[i]==nums[i-1])
continue;
if(nums[i]-nums[i-1]==1)
{
length++;
}
else
{
temp = max(temp,length);
length = 1;
}
}
temp = max(temp,length);
return temp;
}
方法2:ハッシュテーブルを使用して並べ替えとして機能します(時間計算量を満たすことはO(n)です)
O(n)の時間計算量は、ソート関数を使用して達成できないため、ソート関数は使用しません。
しかし、もう一度「ソート」したいので、どうすればよいでしょうか。
他のアイデアで並べ替えを行うことはできますか?
ハッシュテーブルには配列内の各番号の出現回数が格納されていることがわかり、ハッシュテーブル自体が順序付けられていることがわかりました。最初にハッシュテーブルを作成し、次に元の配列をトラバースしてから、ハッシュテーブルを保存します。この時点で、ハッシュテーブルが保存されているので、ハッシュテーブルを直接トラバースすると、必要な「並べ替え」機能が実現されることがわかります。連続して
いる場合は、ハッシュテーブル内で連続している必要があるためです。
したがって、ハッシュテーブルを直接トラバースして長さの計算を開始します。ストレージが0でない場合は、数があると考えて接続に参加できます。特定の数がトラバースされて何も保存されない限り、次のようになります。新しい長さの計算を開始します。つまり、前のルートは接続できないと見なされます。
ただし、C言語の制限により、ハッシュテーブルの使用は特定の状況でのみ使用できます。
コード:
int max(int x,int y)//这里我写的为数字大小为0-9999的情况
{
return x>y?x:y;
}
int longestConsecutive(int* nums, int numsSize){
if(numsSize==0)
return 0;
int hash[10000] = {
0};
int length = 0;
int temp = INT_MIN;
for(int i=0;i<numsSize;i++)
{
hash[nums[i]]++;
}
for(int i=0;i<10000;i++)
{
if(hash[i]!=0)
{
length++;
}
else
{
temp = max(temp,length);
length = 0;
}
}
temp = max(temp,length);
return temp;
}