Chinaunix首页 | 论坛 | 博客
  • 博客访问: 266795
  • 博文数量: 170
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1709
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-06 18:01
文章分类

全部博文(170)

文章存档

2016年(11)

2015年(130)

2014年(29)

分类: Java

2015-03-22 16:54:56



import java.util.Arrays;


//Given an unsorted array, find the maximum difference between the successive elements in 


its sorted form.
//
//Try to solve it in linear time/space.
//
//Return 0 if the array contains less than 2 elements.
//
//You may assume all elements in the array are non-negative integers and fit in the 32-bit 


signed integer range.
//
//Credits:
//Special thanks to @porker2008 for adding this problem and creating all test cases.
public class maximumGap {
    public int maximumGap(int[] num) {
    if (num == null || num.length < 2)
         return 0;
       // get the max and min value of the array 
       int min = num[0];
       int max = num[0];
       for (int i:num) {
         min = Math.min(min, i);
         max = Math.max(max, i);
       }
       // the minimum possibale gap, ceiling of the integer division
       int gap = (int)Math.ceil((double)(max - min)/(num.length - 1));
       int[] bucketsMIN = new int[num.length - 1]; // store the min value in that 


bucket
       int[] bucketsMAX = new int[num.length - 1]; // store the max value in that 


bucket
       Arrays.fill(bucketsMIN, Integer.MAX_VALUE);
       Arrays.fill(bucketsMAX, Integer.MIN_VALUE);
       // put numbers into buckets
       for (int i:num) {
         if (i == min || i == max)
           continue;
         int idx = (i - min) / gap; // index of the right position in the buckets
         bucketsMIN[idx] = Math.min(i, bucketsMIN[idx]);
         bucketsMAX[idx] = Math.max(i, bucketsMAX[idx]);
       }
       // scan the buckets for the max gap
       int maxGap = Integer.MIN_VALUE;
       int previous = min;
       for (int i = 0; i < num.length - 1; i++) {
         if (bucketsMIN[i] == Integer.MAX_VALUE && bucketsMAX[i] == Integer.MIN_VALUE)
           // empty bucket
           continue;
         // min value minus the previous value is the current gap
         maxGap = Math.max(maxGap, bucketsMIN[i] - previous);
         // update previous bucket value
         previous = bucketsMAX[i];
       }
       maxGap = Math.max(maxGap, max - previous); // updata the final max value gap
       return maxGap;
    }
}






阅读(188) | 评论(0) | 转发(0) |
0

上一篇:Match

下一篇:MaximumProductSubarray

给主人留下些什么吧!~~