今天在leetcode上做了一道非常有意思的题,题目如下:
我刚开始写的代码是这样的
//bool find(int* nums, int numsize)
//{
// int prve = 0;//指向前(不是指针,类似与指针思想)
// int last = 1;//指向prve后
// int count = 1;//计数器
// for (prve = 0; prve < numsize; prve++)//当prve后面的数,没有与其相等时,让prve向后移,继续刚才的操作
// {
// count = 1;
// for (last = prve + 1; last < numsize; last++)//让prve不变,让last遍历数组,看看后面有没有与prve相等的(这里说的是元素的下标,判断用下标引用符)
// {
// if (nums[prve] == nums[last])
// {
// count++;
// if (count >= 2)
// {
// return true;
// }
// }
// }
// }
// return false;
//}
写完以后我还特地的检查了一遍,没有发现错误,所以我就提交了,但是让我感觉有意思的一个点是,leetcode报错了,就是没有通过测试用例,后来我看了一下,才发现是因为程序时间超时。而在我们拿到类似于这种题目时,第一思想应该是类似于双指针思想,就是类似于我写的这个一样(排出大佬除外),而我的第一思路也是双指针的思想,然后我就写了如上的代码。但是报错之后我就想了一会,又想出了一种思路,此时的代码如下:
int cmp(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
bool find(int* nums, int numssize)
{
qsort(nums, numssize, sizeof(nums[0]), cmp);
int prve = 0;
int last = prve + 1;
while (last < numssize && prve < numssize)
{
if (nums[prve] == nums[last])
{
return true;
}
else
{
prve++;
last = prve + 1;
}
}
return false;
}
我第二个思路是,西安把数组排序一遍,不用管他是升序还是降序,只要是有序数组就行,为什么要这样呢?或许有些人觉得是多此一举,没必要,但是不是这样的,其实,当数组有序之后,想等的数据会是相邻的,就是紧挨在一起的,此时,我们不需要像上面的第一种思路一样,一个个遍历,相比于第一个方法,这个方法大大的节省了时间。所以,在这个方法中的排序是非常重要的。
最后,如果感觉到对你们有用的话,希望点一下赞,支持一下吧!!!!