力扣217.存在重复元素(思路及解题方法)

今天在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;
}

我第二个思路是,西安把数组排序一遍,不用管他是升序还是降序,只要是有序数组就行,为什么要这样呢?或许有些人觉得是多此一举,没必要,但是不是这样的,其实,当数组有序之后,想等的数据会是相邻的,就是紧挨在一起的,此时,我们不需要像上面的第一种思路一样,一个个遍历,相比于第一个方法,这个方法大大的节省了时间。所以,在这个方法中的排序是非常重要的。

最后,如果感觉到对你们有用的话,希望点一下赞,支持一下吧!!!!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值