美文网首页每日一练
每日一练(1):找出数组中重复的数字

每日一练(1):找出数组中重复的数字

作者: 加班猿 | 来源:发表于2022-01-11 17:11 被阅读0次

title: 每日一练(1):找出数组中重复的数字

categories:[剑指offer]

tags:[每日一练]

date: 2022/01/12


每日一练(1):找出数组中重复的数字

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

示例 1:

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

限制:

2 <= n <= 100000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof

方法一:哈希表

算法流程:

  • 初始化: 新建 Hash

  • Set ,记为 dic ;

  • 遍历数组 nums 中的每个数字 num :

  • 当 num 在 dic 中,说明重复,直接返回 num;

  • 将 num 添加至 dic 中;

  • 返回 -1 。本题中一定有重复数字,因此这里返回多少都可以。

复杂度分析:

  • 时间复杂度 O(N) : 遍历数组使用 O(N) ,HashSet 添加与查找元素皆为 O(1) 。
  • 空间复杂度 O(N): HashSet 占用 O(N) 大小的额外空间。
int findRepeatNumber(vector<int>& num) {
    unordered_map<int, bool> map;
    for (int num : nums) {  //循环遍历
        if (map[num]) {
            return num;
        }
        map[num] = true;
    }
    return -1;
}

方法2:原地交换

算法流程:

  • 1.遍历数组 nums ,设索引初始值为 i = 0:

    • 1.若 nums[i] = i : 说明此数字已在对应索引位置,无需交换,因此跳过;

    • 2.若 nums[nums[i]] = nums[i]: 代表索引 nums[i] 处和索引 i 处的元素值都为 nums[i] ,即找到一组重复值,返回此值 nums[i] ;

    • 3.否则: 交换索引为 i 和 nums[i] 的元素值,将此数字交换至对应索引位置。

  • 2.若遍历完毕尚未返回,则返回 −1 。

复杂度分析:

  • 时间复杂度 O(N) : 遍历数组使用 O(N),每轮遍历的判断和交换操作使用 O(1) 。
  • 空间复杂度 O(1) : 使用常数复杂度的额外空间。
int findRepeatNumber(vector<int>& nums) {
    int i = 0, temp;
    while(i < nums.size()) {
        if(nums[i] == i) {
            i++;
            continue;
        }
        if(nums[nums[i]] == nums[i]) {
            return nums[i];
        }
        temp = nums[i];
        nums[i] = nums[temp];
        nums[temp] = temp;
    }
    return -1;
}

相关文章

  • 每日一练(1):找出数组中重复的数字

    title: 每日一练(1):找出数组中重复的数字 categories:[剑指offer] tags:[每日一练...

  • java如何找出数组中的不重复数字

    java如何找出数组中的不重复数字 找出数组中不重复的一个数字,题目大致是这样的: 1int[] a = { 1,...

  • 剑指offer_数组中重复的数字

    找出数组中重复的数字 1、题目一:找出数组中重复的数字 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 ...

  • 2019-08-04-数组算法

    找出数组中重复的数字 1,题目:长度为n+1的数组中保存这1-n的数字,找出其中任意一个重复的数字,并输出 空间换...

  • 3.数组中重复的数字

    找出数组中任意一个重复的数字! 思路1:把数组排序,从排序后的数组中找出重复的数字。但排序一个长度为n的数组需要O...

  • 《剑指Offer》之数据结构篇

    1. 长度为n数组,数字在 0~n-1 范围内,找出数组中任意一个重复的数 O(n) 2. 不修改数组找出重复数字...

  • 剑指offer4J【C2 P3】找出数组中重复数字

    题目 找出数组中重复的数字数组中数字都在0~n之间,其中有些数字是重复的,但不知道谁重复,可能有1到多个重复的数字...

  • CodingInterview 一刷

    1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...

  • 数组中重复的数字

    题目一:找出数组中重复的数字 在一个长度为 n 的数组里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复...

  • 找出整数数组中任意重复的数字

    整数数组arr大小为n,取值范围0~n-1,可能包含多个重复的数字,如果数组存在重复的数字,请找出数组arr中任意...

网友评论

    本文标题:每日一练(1):找出数组中重复的数字

    本文链接:https://www.haomeiwen.com/subject/ffgwcrtx.html