给定一个无序数组,求这组数在排序后相邻数间差的最大值
2015-01-16 17:36
429 查看
题目来源:https://oj.leetcode.com/problems/maximum-gap/
题目大意:RT
这个题最差的方式是排序,当然时间复杂度是nlogn。
是否有n的方法呢?
假设这组数的最大值为max,最小值为min,对于这样的数据,最差情况就是所有的值的差都相同,那么相邻的最大值为(max-min)/(n-1)。而且修改任何一个数字都将造成结果的增加。
通过这种方法,把min~max分割成N-1个区间(前闭后开),然后将每个数放到对应的区间里。
这样,相邻数字差的最大值其实和区间内的数据无关了(因为区间内无论计算,其结果都将<(max-min)/(n-1))。这样分组后,最终的结果应当就是前一个区间的最大值与后一个区间的最小值的差,当然会出现空的区间,做个标记即可。
时间和空间复杂度都为O(N)
题目大意:RT
这个题最差的方式是排序,当然时间复杂度是nlogn。
是否有n的方法呢?
假设这组数的最大值为max,最小值为min,对于这样的数据,最差情况就是所有的值的差都相同,那么相邻的最大值为(max-min)/(n-1)。而且修改任何一个数字都将造成结果的增加。
通过这种方法,把min~max分割成N-1个区间(前闭后开),然后将每个数放到对应的区间里。
这样,相邻数字差的最大值其实和区间内的数据无关了(因为区间内无论计算,其结果都将<(max-min)/(n-1))。这样分组后,最终的结果应当就是前一个区间的最大值与后一个区间的最小值的差,当然会出现空的区间,做个标记即可。
时间和空间复杂度都为O(N)
/** * Created by jpbirdy on 15-1-16. */ package jpbirdy.leetcode; /** * 给定一个无序数组,找到数组中排序后相邻差最大的值 * * @author jialou.jp * @project JavaAlgorithms * @class MaxGap * @date 15-1-16 17:01 */ public class MaxGap { public int maximumGap(int[] num) { int maxGap = 0; // edge case if (num.length < 2) { return maxGap; } // get maximum and minimum int min = num[0]; int max = num[0]; for (int i = 0; i < num.length; i++) { if (num[i] < min) min = num[i]; if (num[i] > max) max = num[i]; } // divide into identical gaps Gap[] gaps = new Gap[num.length - 1]; boolean[] Engaged = new boolean[num.length - 1]; double gap = (double) (max - min) / (double) (num.length - 1); for (int i = 0; i < gaps.length; i++) Engaged[Math.min((int) Math.floor((double) (num[i] - min) / gap), gaps.length - 1)] = true; // assign maximum and minimum for each gap for (int i = 0; i < gaps.length; i++) gaps[i] = new Gap(); for (int i = 0; i < num.length; i++) { int index = (int) Math.floor((double) (num[i] - min) / gap); index = Math.min(index, gaps.length - 1); // lower bound if (gaps[index].low == -1) gaps[index].low = num[i]; else gaps[index].low = Math.min(gaps[index].low, num[i]); // upper bound if (gaps[index].high == -1) gaps[index].high = num[i]; else gaps[index].high = Math.max(gaps[index].high, num[i]); } // find maximum gap for (int i = 0; i < gaps.length; i++) { if (Engaged[i]) { // check its inner gap maxGap = Math.max(gaps[i].high - gaps[i].low, maxGap); // lower all the way int j = i; while (--j >= 0) { if (Engaged[j]) break; } if (j >= 0) maxGap = Math.max(gaps[i].low - gaps[j].high, maxGap); // upper all the way j = i; while (++j < num.length - 2) { if (Engaged[j]) break; } if (j < gaps.length) maxGap = Math.max(gaps[j].low - gaps[i].high, maxGap); } } return maxGap; } class Gap { int low; int high; boolean hasItem; Gap() { low = -1; high = -1; } Gap(int x, int y) { low = x; high = y; } } public static void main(String[] args) { int[] num = {1, 2, 3, 5, 7, 9}; System.out.println((new MaxGap()).maximumGap(num)); } }
相关文章推荐
- 给定一个无序数组,排序之后求相邻两数之间的最大差值
- 给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大
- 给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大 java实现
- 给定一个字符数组,求由这些字符组成的所有不同的排序问题.
- 给定一个字符串数组,将其元素按字典序列排序
- 给定一个数组,该数组存贮R,G,B三种字符,将该数组按RGB顺序排序,不能使用辅助内存空间,且只能遍历数组一次。
- 给定无序自然数数组,求最大连续自然数个数,时间复杂度为O(n)
- 两个数字,1000个元素的有序数组和10个元素的无序数组,把他们整合成一个按照有序数组排序方式排序的有序数组
- JAVA冒泡排序/JAVA冒泡排序再找出给定数据中的最大值最小值/JAVA数组排序
- 给定一个数组,数组中有正负数,求出所有字数组中和值最大的值。
- 如果给定一个数组arr[0,...N-1],要求找出相邻两个数的最大差值
- 给定一个含有n个元素的整型数组a,求a中的最大值和最小值。
- HDU 1024 Max Sum Plus Plus(动态规划,给定一个数组,求其分成m个不订交子段和最大值的题目)
- 题目:给一个排序好的整数数组A,请写一个函数,输入是数组A和一个整数x,返回数组A中值小于x的最大元素的索引值
- 02_对N个长度最长可达到1000的数进行排序、对给定的一个字符串,找出有重复的字符,并给出其位置、输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序
- 一个无序整数数组,数组元素大于5个,请用一种高效的算法找出其中最大的5个值.
- 不排序,两种方法找到无序数组的最大K个数
- 不排序,两种方法找到无序数组的最大K个数
- 这是一个我面试某公司的算法题目:对一个字符数组进行排序,根据给定的字符,大于它的,放在数组的左边,小于它的,放在数组的右边,且数组中的元素之间的相对位置要保持不变。
- 编写一个使用数组类模板Array对数组进行排序、求最大值和求元素和的程序,并采用相关数据进行测试。