剑指offer:03.数组中重复的数字

题目

找出数组中重复的数字。


在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

解题思路

本题目用了两种方法进行解题,首先是之前比较熟悉的快慢指针方法,对数组进行快排后再用快慢指针比较,不作过多阐述,代码如下

//快慢指针法
#include <algorithm>
#include <vector>
using namespace std;
class Solution {
public:
	int findRepeatNumber(vector<int>& nums)
	{
		int slow = 0;
		int fast = 1;

		//快排升序
		sort(nums.begin(), nums.end());

		while (fast != nums.size())
		{
			if (nums[fast] == nums[slow])
			{
				return nums[slow];
			}
			nums[++slow] = nums[fast++];

		}
		return -1;
	}

};

第二种思路是鲁棒性较高的方法,由于题目中已知是一个长度为n内容在0-n-1区间内的数组,就可以用数组下标和内容对齐的办法进行检验,从前之后将每个数组内容于下标不符合的进行归位,若归为途中找到了目标位置上的元素和下标相等的情况就是重复元素,代码如下

//采用鲁棒的方法
#include <algorithm>
#include <vector>
using namespace std;
class Solution {
public:
	int findRepeatNumber(vector<int>& nums)
	{
		//考虑鲁棒,当数组长度小于等于1时显然不会有重复
		if (nums.size() <= 1) return -1;
		//考虑鲁棒,当数组中出现元素大于n-1或者<0时退出
		for (int i = 0; i < nums.size(); i++)
		{
			if (nums[i] > nums.size() - 1 || nums[i] < 0)
				return -1;
		}

		for (int i = 0; i < nums.size(); i++)
		{
			while(nums[i] != i)
			{
				if (nums[nums[i]] == nums[i])return nums[i];

				//交换num[i]和nums[nums[i]]
				int imp = nums[nums[i]];
				nums[nums[i]] = nums[i];
				nums[i] = imp;
				/*nums[nums[i]] = nums[i] + nums[nums[i]];
				nums[i] = nums[nums[i]] - nums[i];
				nums[nums[i]] = nums[nums[i]] - nums[i];*/
			}
		}

		return -1;
	}

};

ps:在写代码过程中对俩元素交换采用了算术运算的方法避免出现临时变量,但是用以后发现陷入了无限循环,才发现是因为num[i]发生改变后nums[nums[i]]的位置也会因此发生改变,所以这里我们还是要引入临时变量(也可以临时变量存num[i]再用算术运算,但是没必要)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值