2 mss 需要master 的基础知识

面试题3:数组中重复数字

题目一

  • 长度为n的数组
  • 所有数字都在0~n-1
  • 找出数组中任意一个重复的数字
  • 长度为7的数组{2,3,1,0,2,5,3}
    • 数字2或3

  • 还可用哈希表来解决这个问题。
  • 时间复杂度O(n),
  • 提高时间效率是以一个大小为On)哈希表为代价
  • 有没有空间复杂度是O(1)

  • 数组中的数字都在0~n-1。
  • 如果这个数组中没有重复的数字,那么当数组排序之后数字i将出现在下标为i的位置。
  • 数组中有重复的数字,有些位置可能存在多个数字,同时有些位置可能没有数字

  • 重排这个数组。
  • 从头到尾扫描这个数组中每个数
  • 扫到下标为i的数时,
    • 先比较这个数(用m表示)是不是等于i
    • 如果是,则接着扫描
    • 如果不是,则再拿它和第m个数比较
      • 如果它和第m个数相等,就找到一重复
      • 如果它和第m个数不等,就把第i个数和第m个交换
        • 把m放到属于它的位置
  • 接下来再重复这个比较、交换的过程,直到我们发现一个重复的数字

  • {2,3,1,0,2,5,3}。
  • 第0个数是2,与它的下标不等,交换
    • {1,3,2,0,2,5,3}
  • 第0个数字是1,仍然与下标不等,交换
    • {3,1,2,0,2,5,3}
  • 继续交,
    • {0,1,2,3,2,5,3}。
  • 第0个数字的数值为0,接着扫描下一数。
    • 下标为1、2、3的3个数字分別为1、2、3,
    • 不执行任何
  • 接下来扫描到下标为4的数字2。
  • 由于它的数值与它的下标不相等,再比较它和下标为2的数字。
  • 此时数组中下标为2的数字也是2,
    • 也就是数字2在下标为2和下标为4的两个位置都出现了,
    • 找到一个重复

题目二:不修改数组找出重复的数字

  • 长度n+1的数组
  • 所有数字都在1~n
  • 数组中至少有一个数字重复
  • 找出数组中任意一个重复数字
  • 不能修改输入的数组。
  • 长度为8的数组 2 3 5 4 3 2 6 7

在1-7之间

  • 对应的输出是重复的数字2或3

  • 为什么数组中会有重复数?
  • 假如没有重复数字,从1~n的范围里只有n个数。
  • 数组里含超过n个数
    • 一定包含重复数字
  • 在某范围里数字的个数对解决这个问题很重要

  • 从1~n的数字从中间的数字m分为两部分
  • 1~m
  • m+1~n
  • 如果1~m的数字数目超过m,那这一半的区间里一定包含重复的数字
    • 否则,另一半m+1~n的区间里一定包含重复的数字。

指的是1~m这些数在整个数组中出现的次数哦!!

  • 我们可以继续把包含重复数字的区间一分为二,直到找到一个重复的
    数字。
  • 和二分查找算法很类似,只是多了一步统计区间里数字的数目

  • 长度为8数组{2,3,5,4,3,2,6,7
  • 中间的数字4把1~7的范围分为两段,
  • 14,另一段是57。
  • 统计1-4这4个数字在数组中出现的次数,它们一共出现了5次,因此这4个数字中一定有重复数

  • 把1~4的范围一分为二,
  • 1、2两个,
  • 3、4两个数。
  • 数字1或者2在数组中一共出现了两次。
  • 再统计数字3或者4在数组中出现的次数,共出现三次。
  • 3、4两个数中一定有一个重复。
  • 再分别统计这两个数字在数组中出现的次数。
  • 发现3出现了两次

  • 每次统计都要扫描一次数组
  • 但好在只需要统计 log n \log n

猜你喜欢

转载自blog.csdn.net/zhoutianzi12/article/details/107872167
MSS