zoukankan      html  css  js  c++  java
  • 【剑指Offer】面试题03. 数组中重复的数字

    题目

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

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

    限制:
    2 <= n <= 100000

    思路一:哈希表

    初始化哈希表大小为数组元素大小,初始值为-1(因为数组中所有元素大于0)。
    遍历数组每个数字n,如果哈希值为0,表示该数字已经存在,直接返回;否则,更新数字n对应位置哈希值为0表示已经存在。

    代码

    时间复杂度:O(n)
    空间复杂度:O(n)

    class Solution {
    public:
        int findRepeatNumber(vector<int>& nums) {
            vector<int> hash(nums.size(), -1);
            for (auto n : nums) {
                if (hash[n] == 0) return n;
                ++hash[n];
            }
            return -1;
        }
    };
    

    思路二:排序后查找

    排序后,如果存在相邻两个数字相等则返回。

    代码

    时间复杂度:O(nlogn)
    空间复杂度:O(1)

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

    思路三:交换位置

    对每个数组下标位置 i,判断是否等于nums[i]

    • 如果下标位置 i 不等于 nums[i],则nums[i]实际应该放在nums[nums[i]]位置上
      • 如果nums[i] 等于 nums[nums[i]],则找到重复元素;
      • 否则,交换nums[i] 和 nums[nums[i]],即将nums[i]放在了正确的位置。
    • 如果相等,则判断下一个位置。

    代码

    时间复杂度:O(n)
    空间复杂度:O(1)

    class Solution {
    public:
        int findRepeatNumber(vector<int>& nums) {
            for (int i = 0; i < nums.size(); ++i) {
                while (nums[i] != i) {
                    if (nums[nums[i]] == nums[i]) return nums[i];
                    swap(nums[i], nums[nums[i]]);
                }
            }
            return -1;
        }
    };
    
  • 相关阅读:
    服务端渲染
    node基础
    vue不同组件间的通信
    mui底部导航栏
    在mui中引入自定义的字体图标
    axios的使用
    vue多视图
    多元线性回归:波士顿房价预测问题TesnsorFlow实战
    MNIST手写数字识别:分类应用入门(实践篇)
    7-3 java高级 22_19寻找最大块的问题 (20 分)
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12298884.html
Copyright © 2011-2022 走看看