判断数组中是否有重复元素,最直接的思路是用双层循环判断(O(n^2)); 也可以先排序,后比较,但基于比较的排序时间复杂度至少为O(n*logn). 所以,这些思路都不行。根据题目的限制条件,很容易想到用计数排序,时间复杂度为O(n),这当然满足题意,但是,把计数排序用在此处,无疑是大材小用了。在计数排序中,有一个关键的步骤是计数,本题就可以利用计数排序中的计数思想(有点类似于哈希),程序代码如下:
#include<iostream>
using namespace std;
void print(bool b)
{
if(b)
cout << "yes" << endl;
else
cout << "no" << endl;
}
bool hasTheSameNumber(int a[], int n)
{
int *p = new int[n];
int i;
for(i = 0; i < n; i++) //置0
p[i] = 0;
for(i = 0; i < n; i++) //开始计数
p[ a[i] - 1 ]++;
for(i = 0; i < n; i++)
if(p[i] > 1) //有重复
return true;
delete [] p;
return false;
}
int main()
{
int a[] = {1, 3, 4, 2, 5};
int b[] = {1, 6, 2, 3, 4, 1};
print(hasTheSameNumber(a, 5));
print(hasTheSameNumber(b, 6));
return 0;
}