剑指 Offer 03. 数组中重复的数字

找出数组中重复的数字。

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

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

限制:

2 <= n <= 100000

我的思路:

从头开始遍历,利用map函数查找重复的数字直接输出,如果都不重复则输出第一个数字。

代码展示:

int findRepeatNumber(vector<int>& nums) {
	map<int,int>mp;
	 for(int i=0;i<nums.size();i++)
	 {
	     if(mp.count(nums[i]))
	         return nums[i];
	     else
	     {
	         mp[nums[i]]=1;
	     }
	 }
	 return nums[0];
}

优化的思路:

注意到题目中所有数字都在0~n-1这个范围内,因此如果没有重复数字的话,排序后每一个数字正对应自己的下表,即数字i会出现在下标为i的位置

  • 从头开始扫描数组,当扫描到下标为i的数字m后,比较m是否等于i
    • 如果相等,继续向下扫描
    • 如果不等,则判断下标为m的数字是否等于m
      • 如果不等,则交换下标为i和m的数字
      • 如果相等,即找出了重复的数字。

代码展示:

int findRepeatNumber(vector<int>& nums) {
    for(int i = 0; i < nums.size(); i ++) 
        while(nums[i] != i) 
            if(nums[i] == nums[nums[i]]) 
                return nums[i];
            else 
                swap(nums[i], nums[nums[i]]);
    return -1;
}
©️2020 CSDN 皮肤主题: 点我我会动 设计师:上身试试 返回首页