我想先返回(首先遇到,从左到右)数组中的非重复元素。
我带有一个算法,它返回一个非常容易在数组中重复的最小整数,只使用一个数组作为额外空间,长度为数组中的最大整数值:
// smallest non repeating integer
int firstNonRepeatingInteger(int* input, int n)
{
max = std::numeric_limits<int>::min() ;
for(int i = 0 ; i < n ; i++)
{
if(input[i] > max)
max = input[i];
}
int* count = new int[max];
for(int i = 0 ; i < n ; i++)
count[input[i]] += 1 ;
int j = 0;
while(count[i] != 1)
j++ ;
if(j < n)
return input[count[j]] ;
else
return -1 ;
}
然而,我找不到找到第一个满足的算法,除了有另一个n数组存储遇到整数的时间。
任何想法?第一种算法的任何其他实现?
感谢
答案 0 :(得分:4)
你几乎拥有它:
#include <limits>
#include <iostream>
int firstNonRepeatingInteger(int* input, int n)
{
int min = std::numeric_limits<int>::max() ;
int max = std::numeric_limits<int>::min() ;
// Find min/max values in input array.
for(int i = 0; i < n; ++i)
{
if (input[i] > max)
max = input[i];
if (input[i] < min)
min = input[i];
}
int* count;
if (max - min + 1 > n)
{
count = new int[max - min + 1];
// count has more elements than input, so only initialize
// those elements which will be used.
for(int i = 0; i < n; ++i)
count[input[i] - min] = 0;
}
else
{
// Just initialize everything which is more efficient if
// count has less elements than input.
count = new int[max - min + 1]();
}
// Count number of occurrences.
for(int i = 0; i < n; ++i)
++count[input[i] - min];
// Find first non repeating element and return its index,
// or -1 if there is none.
int index = -1;
for (int i = 0; i < n; ++i)
{
if (count[input[i] - min] == 1)
{
index = i;
break;
}
}
delete[] count;
return index;
}
int main()
{
int values[5] = {-2, 4, 6, 4, -2};
int index = firstNonRepeatingInteger(values, 5);
if (index >= 0)
{
std::cout << "Found first non repeating integer " << values[index] <<
" at index " << index << "." << std::endl;
}
else
std::cout << "Found no non repeating integer in array." << std::endl;
return 0;
}
请注意,您的代码有几个问题:
new int[max]
不会使用零初始化数组。您需要使用new int[max]()
代替。注意空括号将所有元素设置为零(参见ISO C ++ 03 5.3.4 [expr.new] / 15)。