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


相邻两数最大差值

代码实现

 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 class Gap {
17     public int maxGap(int[] A, int n) {
18         /**
19          * 第一步,找出这一组数的最大值与最小值之差
20          * 第二步:根据差值开辟合适的桶(桶的数量为数组的长度+1,保证入桶之后,中间有空桶)
21          * 第三步:将每个数放入到对应的桶中,中间会有空桶的情况
22          * 第四步:只需要循环遍历桶,比较后一个桶中最小值与前一个桶中最大值之差,找出差值最大的即为所求
23          */
24
25         //第一步,找出这一组数的最大值与最小值之差
26         int min = A[0];
27         int max = A[0];
28         for(int i=0; i<A.length; i++){
29             if(A[i] < min) min = A[i];
30             if(A[i] > max) max = A[i];
31         }
32
33         //第二步:根据差值开辟合适的桶(桶的数量为数组的长度+1,桶的数量大于数组的长度,中间有空桶)
34         //第三步:将每个数放入到对应的桶中,中间会有空桶的情况
35         boolean[] hasNum = new boolean[A.length+1];//判断桶中是否有数
36         int[] maxNumBucket = new int[A.length+1];//记录当前桶的最大值
37         int[] minNumBucket = new int[A.length+1];//记录当前桶的最小值
38         for(int i=0; i<A.length; i++){
39             int bucketNum = bucket(A[i], A.length, min, max);//当前数应该放入哪个桶中
40             maxNumBucket[bucketNum] = hasNum[bucketNum] ? Math.max(maxNumBucket[bucketNum], A[i]) : A[i];
41             minNumBucket[bucketNum] = hasNum[bucketNum] ? Math.min(minNumBucket[bucketNum], A[i]) : A[i];
42             hasNum[bucketNum] = true;
43         }
44
45         //第四步:只需要循环遍历桶,比较后一个桶中最小值与前一个桶中最大值之差,找出差值最大的即为所求
46         int result = 0;//最终的结果
47         int leftBucketMax = maxNumBucket[0];//0号桶肯定有值
48         int rightBucketMin = 0;
49         int startBucket = 1;//从1号桶开始进行遍历
50
51         for(int i=startBucket; i<A.length+1; i++){
52             if(!hasNum[i]) continue;
53             rightBucketMin = minNumBucket[i];
54             if(rightBucketMin - leftBucketMax > result)
55                 result = rightBucketMin - leftBucketMax;
56             leftBucketMax = maxNumBucket[i];
57         }
58
59         return result;
60     }
61     public int bucket(long num, long arrLength, long min, long max) {//防止两个int型的数相乘,越界
62         /**
63          * 3,7,12,6,4
64          * 最小值3,最大值12,每个桶的范围是(12-3)/5
65          *
66          * 假设当前值为6,那么它应放入(int)((6-3)/(9/5))桶中
67          */
68         return (int)((num-min)/((max-min)*1.0/arrLength));
69     }
70     @Test
71     public void test(){
72         int[] arr = new int[]{3,7,19,6,4};
73         System.out.println(maxGap(arr,5));
74     }
75 }

测试结果

时间: 2024-08-09 22:02:44

算法--相邻两数最大差值的相关文章

第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

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

有一个整形数组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

给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度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),且要求不能用非基于比较的排

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

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

LeetCode算法题——两数之和(python)

两数之和: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数.你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用.例如:给定 nums = [2, 7, 11, 15], target = 9.由nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1] 原文地址:http://blog.51cto.com/13921683/2318829

LeetCode算法1—— 两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] Solution: class Solution { public int[] twoSum(int[] nums, int target) { int[] arr = new int[2]; for(

力扣算法初级——两数之和

相关知识点: 1.c++计算数组的大小:使用“数组名+size()” 2.c++返回多个数据的方法:return {a,b,……} 3.哈希表:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 原文地址:https://www.cnblogs.com/181118ljh123/p/11650082.html

每日一道算法题--两数之和

题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1] 代码: function(nums, target) { let arr = [] for (let i = 0

算法(两数之和)

func twoSum(nums []int, target int) []int { array1 := make([]int, 0) final := 0 for i := 0; i < len(nums); i++ { for j := 0; j < len(nums); j ++ { if (nums[i] + nums[j] == target && i != j) { array1 = append(array1, i) array1 = append(array1