2021/3/23剑指面试3 数组中重复的数字

2021/3/23剑指面试3 数组中重复的数字
找出数组中一个任意重复的数字

https://blog.csdn.net/minghui_/article/details/80542760
这个不错

方法一:排序+扫描 时间nlogn

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
		int same;
		for (int i = 0; i < nums.size(); i++)
		{
			same = nums[i];
			if (i != 0 && same == nums[i-1])
			{
				return nums[i];
			}
		}
    return  -1;
    }
};

或者排序后计数 数量大于一的输出
方法二:哈希表 时间o(n)
使用哈希表把遍历过的元素存下来,如果发现一次就记录1,发现两次就记录2,并且每次遍历检查,如果大于等于2了,就返回该重复的数字(因为只用返回任意一个重复数字)

https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/mian-shi-ti-03-shu-zu-zhong-zhong-fu-de-shu-zi-yua/
这个写得好

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        unordered_map<int, bool> map;
        for(int num : nums) {
            if(map[num]) return num;//如果哈希表里有这个数 就return
            map[num] = true;//没有就加入哈希表
        }
        return -1;
    }
};

上述代码中

for (auto x : nums)

作用就是迭代容器中所有的元素,每一个元素的临时名字就是x,等同于下边代码

for (vector<int>::iterator iter = nums.begin(); iter != nums.end(); iter++)

方法三:原地交换
题目说明尚未被充分使用,即 在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范围内 。 此说明含义:数组元素的 索引一对多 的关系。
因此,可遍历数组并通过交换操作,使元素的 索引 与 值 一一对应(即 nums[i] = i)。因而,就能通过索引映射对应的值,起到与字典等价的作用。

2021/3/23剑指面试3 数组中重复的数字
2021/3/23剑指面试3 数组中重复的数字

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        int i = 0;
        while(i < nums.size()) {
            if(nums[i] == i) {
                i++;
                continue;
            }
            if(nums[nums[i]] == nums[i])
                return nums[i];
            swap(nums[i],nums[nums[i]]);
        }
        return -1;
    }
};

作者:jyd
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/mian-shi-ti-03-shu-zu-zhong-zhong-fu-de-shu-zi-yua/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这个道理懂了 程序还应多看看

上一篇:Zhong__Git简单使用


下一篇:centos7磁盘配额管理