Description

牛客网 2018校招真题 最大差值

Solving Ideas

如果数组长度为n,则使用n+1个桶,每个桶能放入数的范围固定,将数组中的数依次放入桶中,最终最大差值出现在相邻两个不为空的桶之间。

因为第一个桶会被放入所有元素中的最小值,最后一个桶会被放入所有元素中的最大值,也即第一个桶和最后一个桶必定不为空,那么空桶一定不会出现在首尾。例如:
有数组10,25,34,43,50,则n = 5,min = 10,max = 50
使用6个桶,每个桶的大小为(max - min) / n = 8,具体范围如下:
[10, 18), [18, 26), [26, 34), [34, 42), [42, 50), [50, 58)
则10在0号桶,25在1号桶,34在3号桶,43在4号桶,50在5号桶

为什么最大差值不会出现在桶内,如果某个桶有多个值,那么其桶内最大差值将小于桶的大小,又因为首尾之间必有空桶存在(鸽巢原理,n个数放入n+1个桶,则必有一个桶为空),而横跨至少一个空桶的差值一定比桶内差值大,所以最大差值不会出现在桶内。

Time complexity : O(n)O(n)O(n)
Space complexity : O(n)O(n)O(n)

Solution

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;/*** 桶排序* @author wylu*/
public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());String[] strs = br.readLine().split(" ");n = strs.length;int[] a = new int[n];int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;for (int i = 0; i < n; i++) {a[i] = Integer.parseInt(strs[i]);if (a[i] < min) min = a[i];if (a[i] > max) max = a[i];}if (n < 2 || max == min) {System.out.println(0);return;}//每个桶是否有值boolean[] hasNum = new boolean[n + 1];//每个桶的最小值int[] low = new int[n + 1];//每个桶的最大值int[] high = new int[n + 1];for (int num : a) {int idx = getBucketIndex(num, n, max, min);low[idx] = hasNum[idx] ? Math.min(low[idx], num) : num;high[idx] = hasNum[idx] ? Math.max(high[idx], num) : num;hasNum[idx] = true;}int res = 0, lastMax = high[0];for (int i = 1; i <= n; i++) {if (hasNum[i]) {res = Math.max(res, low[i] - lastMax);lastMax = high[i];}}System.out.println(res);}private static int getBucketIndex(long num, long n, long max, long min) {return (int) ((num - min) * n / (max - min));}
}

牛客网 2018校招真题 吉比特 最大差值相关推荐

  1. 牛客网 2018校招真题 美团点评 K的倍数

    Description 牛客网 2018校招真题 K的倍数 Solving Ideas sum[i + 1]: 表示序列p[0]...p[i]的和 从长度最大的子串开始判断,当剩余需要判断子串长度不可 ...

  2. 牛客网 2018校招真题 摩拜 排序次数

    Description 牛客网 2018校招真题 排序次数 Solving Ideas 将数组a的元素拷贝到数组b 对数组b进行排序 对比数组b,统计数组a中已排序的元素个数 如:a = [2, 11 ...

  3. 牛客网 2018校招真题 滴滴出行 寻找丑数

    Description 牛客网 2018校招真题 寻找丑数 Solving Ideas 参考<剑指offer>丑数 Time complexity : O(n)O(n)O(n) Space ...

  4. 牛客网 2018校招真题 爱奇艺 最后一位

    Description 牛客网 2018校招真题 最后一位 Solving Ideas 二分查找 Solution import java.io.BufferedReader; import java ...

  5. 牛客网 2018校招真题 京东 回文

    Description 牛客网 2018校招真题 回文 Solving Ideas 计算以str[str.length() - 1]为结尾的最大的回文长度,从而判断最少需要追加多少个字母才能使整个串成 ...

  6. 牛客网 2018校招真题 美团点评 关灯游戏

    Description 牛客网 2018校招真题 关灯游戏 Solving Ideas 只与最右边的数字有关,如果最右边的数字为1,则Alice赢,否则Bob赢 假设最右边的数字为1 因为Alice是 ...

  7. 牛客网 2018校招真题 网易 骰子游戏

    Description 牛客网 2018校招真题 骰子游戏 Solving Ideas 参考<剑指offer>n个骰子的点数 考虑用两个数组来存储骰子点数的每一个总数出现的次数. 在一次循 ...

  8. 牛客网 2018校招真题 美团点评 重要节点

    Description 牛客网 2018校招真题 重要节点 Solving Ideas BFS 创建一个标记数组arrive,arrive[i][j]为true表示从i可以到达j, false则不能 ...

  9. 牛客网 2018校招真题 招商银行信用卡 整数成绩最大化

    Description 牛客网 2018校招真题 整数成绩最大化 Solving Ideas 当n>4时,最大受益为尽可能拆分出更多的数字3,最后一个不足3的,若其为1则分给其中一个3,得到4, ...

  10. 牛客网——2017校招真题在线编程(pythonC++)

    牛客网--2017校招真题在线编程(python&C++) 1.n个数里的最小k个 题目描述 找出n个数里最小的k个 输入描述: 每个测试输入包含空格分割的n+1个整数,最后一个整数为k值,n ...

最新文章

  1. 应用 | 红黄蓝的虐童惨案,其实可以用机器学习等技术来避免
  2. python【力扣LeetCode算法题库】26-删除排序数组中的重复项
  3. python解析html模块_Python HTMLParser模块解析html获取url实例
  4. js中判断-0 ,js无穷数Infinity
  5. 支付宝 网页授权 获取用户信息
  6. Sentinel隔离和降级
  7. firefox应用自动全屏显示_【b】—自动化测试:基础selenium—API
  8. 窗口,视图,视图控制器和UIKit基础-IOS开发
  9. 列表推导式 python原理_python之列表推导式
  10. 【英语学习】【WOTD】trivial 释义/词源/示例
  11. hibernate 插入 效率_美信半导体:打开工厂边缘智能化新思路,助力工厂效率提升...
  12. 论如何快速的培养一个软件测试工程师出来
  13. 百度地图api-基本用法总结
  14. Python上位机与C51单片机串口通信
  15. MySQL权限系统(一).The MySQL Access Privilege System 概述
  16. linux中seliunux配置文件,SELinux 入门简介
  17. 说唱 -- 再见大四
  18. 付费代理个人测评及选取——重复率、可用率、响应时间、稳定性、价格(只供参考)...
  19. 传统防火墙与下一代防火墙的区别
  20. OpenMesh 报错“Use dereferencing operators - and * instead.”的解决

热门文章

  1. 制作字幕.html教程,怎样制作视频字幕
  2. 那些年我们一起追过的稀奇古怪的SQL
  3. Maven3.8.1下载
  4. 《鬼武者3》全攻略宝典
  5. php去除空格、制表符、换页符
  6. java读取word目录
  7. 透明网桥自学习转发帧解题记录
  8. iOS 技术支持网址:
  9. IntelliJ IDEA优化内存配置提高启动和运行速度
  10. 如何裁剪视频?这两个简单方法你们还不快来学