文章目录
排序后的最大相邻数差值问题
- 无序数组,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”