给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排序

思路:

  桶排序

  N个数,设置 N+ 1 个桶,,一定有一个空桶,,为的是保证最大差值一定是不是出现在同一个桶中;

  只要比较 非空桶 的最小值,与前一个 非空桶的最大值,求 最大的差值,

  1 package my_basic;
  2
  3 import java.text.Bidi;
  4 import java.util.Arrays;
  5
  6 public class MaxGap {
  7
  8     /*给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排序*/
  9
 10     public static int maxGap(int[] arr) {
 11         if (arr == null || arr.length < 2) {
 12             return 0;
 13         }
 14         //获取最小值 最大值
 15         int len = arr.length;
 16         int min = Integer.MAX_VALUE;
 17         int max = Integer.MIN_VALUE;
 18         for (int i = 0; i < arr.length; i++) {
 19             min = Math.min(min, arr[i]);
 20             max = Math.max(max, arr[i]);
 21         }
 22         if (min == max) {
 23             return 0;
 24         }
 25         //放到桶里
 26         boolean[] hasNum = new boolean[len + 1];
 27         int[] mins = new int[len + 1];
 28         int[] maxs = new int[len + 1];
 29
 30         int bid = 0;
 31 //        for (int i = 0; i < arr.length; i++) {
 32 //            bid = bucket(arr[i], len, min, max);
 33 //            hasNum[bid] = true;
 34 //            mins[bid] = Math.min(mins[bid], arr[i]);
 35 //            maxs[bid] = Math.max(maxs[bid], arr[i]);
 36 //        }
 37         for (int i = 0; i < len; i++) {
 38             bid = bucket(arr[i], len, min, max);
 39             mins[bid] = hasNum[bid] ? Math.min(mins[bid], arr[i]) : arr[i];
 40             maxs[bid] = hasNum[bid] ? Math.max(maxs[bid], arr[i]) : arr[i];
 41             hasNum[bid] = true;
 42         }
 43
 44         //找最大间距
 45         int res =0;
 46         int m = maxs[0];
 47         for(int i=1 ;i <= len;i++) {
 48             if (hasNum[i]) {
 49                 res = (mins[i] - m)>res ? (mins[i] - m) : res;
 50                 m = maxs[i];
 51             }
 52         }
 53         return res;
 54
 55     }
 56
 57     //放到几号桶里
 58     public static int bucket(long num, long len, long min, long max) {
 59         return (int) ((num - min) * len / (max - min));
 60     }
 61
 62     //对数器
 63     public static int[] generateRandomArray(int maxSize, int maxValue) {
 64         int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
 65         for (int i = 0; i < arr.length; i++) {
 66             arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
 67         }
 68         return arr;
 69     }
 70     public static int comparetor(int[] arr) {
 71         if (arr==null || arr.length < 2) {
 72             return 0;
 73         }
 74         Arrays.sort(arr);
 75 //        printArray(arr);
 76         int res=0;
 77         for (int i = 1; i < arr.length; i++) {
 78             res = (arr[i] - arr[i-1]) > res? (arr[i] - arr[i-1]) :res;
 79         }
 80         return res;
 81     }
 82
 83     public static void printArray(int[] arr) {
 84         for (int i = 0; i < arr.length; i++) {
 85             System.out.print(arr[i]+" ");
 86         }
 87         System.out.println();
 88     }
 89     public static int[] copyArray(int[] arr) {
 90         if (arr == null) {
 91             return null;
 92         }
 93         int[] res = new int[arr.length];
 94         for (int i = 0; i < arr.length; i++) {
 95             res[i] = arr[i];
 96         }
 97         return res;
 98     }
 99
100     public static void main(String[] args) {
101         int maxSize =10;
102         int maxValue = 50;
103         boolean succeed = true;
104         int[] arr1 = generateRandomArray(maxSize, maxValue);
105         printArray(arr1);
106         int res = maxGap(arr1);
107
108         int[] arr2 = copyArray(arr1);
109         int res2 = comparetor(arr2);
110         if (res != res2) {
111             printArray(arr1);
112             printArray(arr2);
113             System.out.println(res);
114             System.out.println(res2);
115
116         }else {
117             System.out.println("nice!");
118         }
119
120     }
121
122
123
124 }

原文地址:https://www.cnblogs.com/lihuazhu/p/10759585.html

时间: 2024-08-11 05:16:16

给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排序的相关文章

【算法】—— 相邻两数的最大差值

题目: 思路: 如果数组长度为N,考虑使用N+1个桶,每个桶能放入数的范围固定,将数组中数据依次放入桶中,那么肯定有一个桶是空桶(因为数一共有N个,而桶有N+1个). 最大差值就出现在相邻两个不为空的桶之间,具体为当前铜的最小值减去前一个桶的最大值. 需要注意的是:如何对于每个数,计算它应该放入的桶号. public static int bucket(long num, long len, long min, long max) { return (int) ((num - min) * le

排序练习题(六):相邻两数最大差值

有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值. 给定一个int数组A和A的大小n,请返回最大的差值.保证数组元素多于1个. 测试样例: [1,2,5,4,6],5 返回:2 public class Gap { public int maxGap(int[] A, int n) { // write code here if(null == A ||n<2) return 0; int min=Integer.MAX_VALUE; int max=Intege

第2章 排序 || 第20节 相邻两数最大差值练习题

题目 有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值. 给定一个int数组A和A的大小n,请返回最大的差值.保证数组元素多于1个. 测试样例: [1,2,5,4,6],5 返回:2 解析: // 第20节 相邻两数最大差值练习题 // 基于桶排序的思想完成,不考虑两个相同的桶内的差值,只考虑该桶的最小值减去上一个桶的最大值,最大的就是最大值. class Gap { public: int maxGap(vector<int> A, int n) { // w

算法--相邻两数最大差值

相邻两数最大差值 代码实现 1 package com.hzf.sort; 2 3 import org.junit.Test; 4 5 /** 6 * 有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值. 7 * 8 * 给定一个int数组A和A的大小n,请返回最大的差值.保证数组元素多于1个. 9 * 10 * 测试样例: [1,2,5,4,6],5 11 * 返回:2 12 * 13 * @author hzf 14 * 15 */ 16 public cla

[程序员代码面试指南]数组和矩阵问题-数组排序后相邻数的最大差值(桶排序思想)

题意 给定一个整形数组arr,返回排序后的相邻两数的最大差值. 题解 借助桶排序思想. 首先遍历一遍获得最大值max,最小值min. 设数组长度为len,则有len+1个桶,桶负责的区间大小是(max-min)/len,数字num放入的桶id是(num-min)/((max-min)/len)即(num-min)*len/(max-min). 由于min在桶0,max在桶len+1,所以一定隔了至少一个空桶.所以"排序后的相邻两数的最大差值"一定是相邻的两个非空桶的(区间存较大数的桶)

[算法]数组排序之后相邻数的最大差值

题目: 给定一个整形数组arr,返回排序后的相邻两数的最大差值. 时间复杂度为O(N). 解答: 如果用排序法实现,其时间复杂度为O(NlogN),而如果利用桶排序的思想(不是桶排序),可以做到O(N),额外空间复杂度为O(N).遍历arr找到最大值max和最小值min.如果arr的长度为N,准备N+1个桶,把max单独放在第N+1个桶中,[min,max)范围上的数放在1~N号桶里,对于1~N号桶中的每一个桶来说,负责的区间为(max-min)/N.如果一个数为num,它应该分配进(num-m

给定一个数组,求如果排序后,相邻两个元素的最大差值,要求时间复杂度为O(N)

第一种方法: 计数排序后,然后找出两两之间的最大差值 计数排序的时间复杂度是O(N) public class CountSort { public static void main(String[] args) { int[] arr = new int[] { 2, 5, 12, 8, 6, 90, 34, 10, 10 }; sort(arr); Arrays.stream(arr).forEach(x -> System.out.print(x + " ")); //计算

求一个数组中a[0...i-1] 离a[i]最接近的值

博客主页:http://blog.csdn.net/minna_d 题目: 给一个n个元素的线性表A,对于每个数Ai,找到它之前的数中,和它最接近的数.即对于每个i,计算 Ci = min{|Ai-Aj| | 1<=j<i} 规定C1 = 0. 其实就是给定一个数组, 在a[0....i-1]中求离a[i]最近的值, 其实这里有个bug,那就是,如果对与6而言5,7都离它一样, 那么该输出谁呢 N久不写C, 感觉怪怪的, 写了一个java版. 思路: 用一个临时数组存储,离a[i]最近值 用另

StringBuffer- 需求,给定一个数组,int [] arr = {44,33,55,66,88}变成[44, 33, 55, 66, 88]

package cn.StringBuffer; /* * * 需求,给定一个数组,int [] arr = {44,33,55,66,88}; * 变成[44, 33, 55, 66, 88] * * */ public class PinJie { public static void main(String[] args) { int [] arr = {44,33,55,66,88}; String str = pinjie(arr); System.out.println("拼接后的字