题目链接力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
本题是要找到数组中的重复元素,所以我们分析出一下几点:
1. bool是一种数据类型,true是非0值,false是0.。
2. 数组中只要任意一个值出现两次及以上就返回true。
3. 数组中每个元素都不同,也就是每个元素只出现一次就返回false。
我们首先想到的就是遍历两次数组,但是需要注意的是时间复杂度是O(N^2),我们这样写的代码是过不去的,因为当数组很大的时候,跑的会很慢,时间超过了限制。
所以我们在这里要放弃遍历的思想,那应该怎么解决呢?
作者想到的方法,利用希尔排序来解决问题,通过排序,找到相同的元素就返回1,如果当排序结束的时候还没有找到就返回0。下面就是代码啦!
int ShellSort(int* a,int n)
{
int gap = n;
int ret = 0;
while(gap > 1)
{
gap = gap / 2;
for (int i = 0; i < n-gap; ++i)
{
int end = i;
int tmp = a[end+gap];
while(end >= 0)
{
if(a[end] > tmp)
{
a[end+gap] = a[end];
end = end - gap;
}
else if(a[end] == tmp)
{
ret = 1;
return ret;
}
else
break;
}
a[end+gap] = tmp;
}
}
return ret;
}
bool containsDuplicate(int* nums, int numsSize)
{
return ShellSort(nums,numsSize);
}