C ++在具有O(n)空间的数组中找到第一个非重复整数

时间:2012-10-07 18:29:46

标签: c++ arrays algorithm sorting find

我想先返回(首先遇到,从左到右)数组中的非重复元素。

我带有一个算法,它返回一个非常容易在数组中重复的最小整数,只使用一个数组作为额外空间,长度为数组中的最大整数值:

// 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数组存储遇到整数的时间。

任何想法?第一种算法的任何其他实现?

感谢

1 个答案:

答案 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)。
  • 输入数组中的负值将导致内存访问冲突。