整数の配列が与えられます。範囲内のすべての数値が配列に存在するように、最大範囲を出力する必要があります。番号は任意の順序で存在する可能性があります。たとえば、配列が
{2, 10, 3, 12, 5, 4, 11, 8, 7, 6, 15}
ここでは、これらの範囲内のすべての整数が配列に存在する 2 つの (自明ではない) 範囲、つまり [2,8] と [10,12] を見つけます。これらのうち [2,8] は長い方です。したがって、それを出力する必要があります。
この質問をされたとき、並べ替えを使用せずに線形時間でこれを行うように求められました。ハッシュベースの解決策があるのではないかと考えましたが、何も思いつきませんでした。
これが私の解決策の試みです:
void printRange(int arr[])
{
int n=sizeof(arr)/sizeof(int);
int size=2;
int tempans[2];
int answer[2];// the range is stored in another array
for(int i =0;i<n;i++)
{
if(arr[0]<arr[1])
{
answer[0]=arr[0];
answer[1]=arr[1];
}
if(arr[1]<arr[0])
{
answer[0]=arr[1];
answer[1]=arr[0];
}
if(arr[i] < answer[1])
size += 1;
else if(arr[i]>answer[1]) {
initialize tempans to new range;
size2=2;
}
else {
initialize tempans to new range
}
}
//I have to check when the count becomes equal to the diff of the range
この部分で立ち往生しています...いくつの tempanswer[] 配列を使用する必要があるかわかりません。