lintcode:最大间隔
题目
给定一个未经排序的数组,请找出其排序表中连续两个要素的最大间距。
如果数组中的要素少于 2 个,请返回 0.
注意事项
可以假定数组中的所有要素都是非负整数,且最大不超过 32 位整数。
给定数组 [1, 9, 2, 5]
,其排序表为 [1, 2, 5, 9]
,其最大的间距是在 5
和 9
之间,= 4
.
解题
排序后找出最大间隔
堆排序后找到相邻最大值
class Solution {
/**
* @param nums: an array of integers
* @return: the maximum difference
*/
public int maximumGap(int[] nums) {
// write your code here
heapSort(nums);
int res = 0;
for(int i=0;i<nums.length-1;i++){
res = Math.max(res,nums[i+1] - nums[i]);
}
return res;
} public int left(int i){
int l = i*2+1;
return l;
}
public int right(int i){
int r = i*2 +2;
return r;
}
public void heapSort(int[] A){
int n= A.length-1;
maxHeap(A,n); for(int i=n;i>=1;i--){
swap(A,0,i);
insertToHeap(A,0,i-1);
}
}
// 构建大顶堆
public void maxHeap(int[] A,int n){ for(int i=n/2;i>=0;i--){
insertToHeap(A,i,n);
}
}
// 第i位置插入的堆中,调整为大顶堆
public void insertToHeap(int[] A,int i,int n){
int l = -1;
int r = -1;
int largest = -1;
while(true){
l = left(i);
r = right(i);
// 找到最大值id
if(l<=n && A[l] > A[i]){
largest = l;
}else{
largest = i;
}
if(r<=n && A[r] > A[largest]){
largest = r;
}
if(largest!=i){ // 不等时候交换,并更新i循环进行
swap(A,largest,i);
i = largest;
}else{
break;
} }
}
public void swap(int[] A,int i,int j){
int tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}
利用桶排序
参考链接
用n个桶
将n个数据放入到桶内
桶内存放可以放入该桶的数据的最大值和最小值
桶的边缘定义low,high,表示放入该桶内数据的边界,n个桶 的大小d = high - low 是固定的,并且 d = (max - min)/n
这样不会出现数据都在一个桶内的情况
最大的间隔一定在相邻桶间,gap = now.low - pre.high
class Solution {
/**
* @param nums: an array of integers
* @return: the maximum difference
*/ class Bucket{
int low;
int high;
public Bucket(){
low = -1;
high = -1;
}
} public int maximumGap(int[] num) {
if(num == null || num.length < 2){
return 0;
}
// 找到最大值最小值
int max = num[0];
int min = num[0];
for(int i=1; i<num.length; i++){
max = Math.max(max, num[i]);
min = Math.min(min, num[i]);
} // initialize an array of buckets
Bucket[] buckets = new Bucket[num.length+1]; //project to (0 - n)
for(int i=0; i<buckets.length; i++){
buckets[i] = new Bucket(); // 初始化桶
} double interval = (double) num.length / (max - min);
//distribute every number to a bucket array
for(int i=0; i<num.length; i++){
int index = (int) ((num[i] - min) * interval);
// 放入桶内
if(buckets[index].low == -1){
buckets[index].low = num[i];
buckets[index].high = num[i];
}else{
buckets[index].low = Math.min(buckets[index].low, num[i]);
buckets[index].high = Math.max(buckets[index].high, num[i]);
}
} //scan buckets to find maximum gap
int result = 0;
int prev = buckets[0].high;
for(int i=1; i<buckets.length; i++){
if(buckets[i].low != -1){
result = Math.max(result, buckets[i].low-prev);
prev = buckets[i].high;
} } return result;
}
}
lintcode:最大间隔的更多相关文章
- leetcode & lintcode for bug-free
刷题备忘录,for bug-free leetcode 396. Rotate Function 题意: Given an array of integers A and let n to be it ...
- leetcode & lintcode 题解
刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...
- [LintCode]——目录
Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...
- 块级标签包含行内标签底部出现3px间隔的解决办法
当块级标签(如div)内包含了行内标签(如img),则外层元素与内层元素底部会出现3px的间隔: 代码如下: <!doctype html> <html lang="en& ...
- (lintcode全部题目解答之)九章算法之算法班题目全解(附容易犯的错误)
--------------------------------------------------------------- 本文使用方法:所有题目,只需要把标题输入lintcode就能找到.主要是 ...
- Lintcode 85. 在二叉查找树中插入节点
-------------------------------------------- AC代码: /** * Definition of TreeNode: * public class Tree ...
- Lintcode 166. 主元素
----------------------------------- Moore's voting algorithm算法:从一个集合中找出出现次数半数以上的元素,每次从集合中去掉一对不同的数,当剩 ...
- Lintcode 166. 链表倒数第n个节点
----------------------------------- 最开始的想法是先计算出链表的长度length,然后再从头走 length-n 步即是需要的位置了. AC代码: /** * De ...
- Lintcode 157. 判断字符串是否没有重复字符
------------------------ 因为字符究竟是什么样的无法确定(比如编码之类的),恐怕是没办法假设使用多大空间(位.数组)来标记出现次数的,集合应该可以但感觉会严重拖慢速度... 还 ...
随机推荐
- hi3531播放1080p60f, 延迟越来越大的问题与解决办法
问题 hi3531播放1080p60f, 延迟越来越大 左边屏幕是ffplay播放的,右边屏幕是3531播放的 数据是udp组播 mpegts, h264 12M码流 原因 经过测试发现: 解码器中缓 ...
- 004--VS C++ 绘制封闭图形
//全局变量HPEN hPen;HBRUSH hBru[4];int sBru[4] = { HS_VERTICAL, HS_HORIZONTAL, HS_CROSS, HS_DIAGCROSS }; ...
- homework-02 二维的,好喝的(二维数组的各种子数组)
1)输入部分 对于输入部分,我定义的输入格式是这样的 前两行为列数和行数 如果文件无法打开,或者输入文件格式不对,均会提示出错并退出 2)二维数组的最大矩形子数组 首先,我使用最最简单的暴力算法,直接 ...
- [LAMP]——mod_security和mod_evasive模块的安装
系统版本:Red Hat 6 httpd版本:httpd-2.4.20 tar包:modsecurity-apache_2.5.9.tar.gz mod_evasive_1.10.1.tar.gz ...
- Machine Learning 学习笔记 (2) —— 使用牛顿法寻找极值
本系列文章允许转载,转载请保留全文! [请先阅读][说明&总目录]http://www.cnblogs.com/tbcaaa8/p/4415055.html 1. 用牛顿法解方程 牛顿法是一种 ...
- 微软职位内部推荐-Senior Software Engineer-Office Incubation
微软近期Open的职位: Office China team is looking for experienced engineers to improve consumer experience i ...
- ED/EP简介
ED:electronic Deposit,电子存折 EP:electronic Purse,电子钱包 PIN:personal identification number,个人识别码 MAC:Mes ...
- CentOS7下通过rpm方式安装MySQL及插入中文问题解决 [原创]
一 CentOS下通过rpm方式安装MySQL CentOS版本:CentOS-7 MySQL版本:MySQL-5.6.22 在网上搜了一下,Linux下安装MYSQL有三种方式: 1) 通过yum命 ...
- Introduction to Financial Management
Recently,i am learning some useful things about financial management by reading <Essentials of Co ...
- SPFA 原理剖析代码实现分析比较
算法简介 SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算. 算法流程 算法大致流程是用一个队列来进行维护. ...