排序后的最大相邻数差值问题+桶排

排序后的最大相邻数差值问题

  • 无序数组,long,
  • 取值范围不
  • 返回排序之后相邻两数的最大差值。
  • 要求O(N)完成。

  • 首先想到桶排序,
  • 面试官已经将我们使用桶排序的前提否定了(大数据类型,范围不定,但数据个数较少),
  • 我们可借用桶的概念,但并不桶排序。
  • 正常情况下桶的个数不是通过数的范围来决定的,但是由于数字范围太大,所以无法桶排序,因此我们可以由数的个数来确定桶的个数。

  • 1 先遍历数组,找到最大值与最小值
  • 2 N个数,准备N+1个桶
    • 用这N+1个桶来平分最大值与最小值这范围
    • 第一个桶和最后一个桶必有数据,中间必有空桶
    • 同一个桶内相邻数字之间是不可能产生最大差值
  • 3 找到左边离他最近的非空桶和右边最近的非空桶,
    • 并找到左边非空桶的最大值与右边非空桶的最小值,
    • 那么他们俩在排序之后一定是相邻的
  • 4 对于同一桶内的数据,只需要记录当前桶内是否有数据,
    • 及最大值和最小值
  • 5 题中要求的最大值定在相邻两个非空桶之间产生
  • 6 题中桶的概念就是数据状况。

  • 9个位于0-99的数,
  • 5、12、25、41、55、58、76、88、99。
  • 准备10个桶,用这10个桶平分0-99的空间

canci

桶排

  • 分数按照从高到低排
  • 5 、3 、5 、2 和 8 ,
  • 排序后是 8 5 5 3 2

  • 只需一个一维数组就可
  • 申请int a[11]
  • 现在有11 个变量,a[0]~a[10]。
  • 刚开始时,将 a[0]~a[10]都初始化为 0,
  • 表示这些分数还都没有人得过。
  • a[0]等 0 表示目前还没人得 0 分
  • a[1]等于 0 表示目前还没人得 1……a[10]等于 0 就表示目前还没有人得过 10

  • 第一个人5 分
  • 就将a[5]加 1,即将 a[5]的值从 0 改为 1
  • 表示 5 分出现过了一次。

在这里插入图片描述

  • 第二个人3 分,
  • 就把a[3]加 1,
  • 即将 a[3]的值从 0 改为 1,表示 3 分出现过了一次。

在这里插入图片描述

  • 第三个人也“5 分”,
  • 所以a[5]再加 1,为 2。
  • 表示 5 分出现过了两次。

在这里插入图片描述

  • 按照刚才的方法处理第四个和第五个人的分数。
  • 最终结果就是下面这个图啦。

在这里插入图片描述

  • a[0]~a[10]其实就是 0 分到 10 分每个分数出现的次数。
  • 只需要将出现过的分数打印出来就可以了,出现几次就打印几次,
  • a[0]为 0,表示“0”没有出现过,不打印。
  • a[1]为 0,表示“1”没有出现过,不打印。
  • a[2]为 1,表示“2”出现过 1 次,打印 2。
      a[3]为 1,表示“3”出现过 1 次,打印 3。

最终屏幕输出“2 3 5 5 8”

canci

猜你喜欢

转载自blog.csdn.net/zhoutianzi12/article/details/107671686