当前位置:网站首页>无序数组排序并得到最大间隔
无序数组排序并得到最大间隔
2022-08-02 14:01:00 【Ethan_199402】
问题描述
给定一个无序整型数组,求将其排好序后,并得出相邻两个数之间的最大差值。
例如:{1,3,2,5,7,4,13}
排序后{1,2,3,4,5,7,13} 那么最大间隔是6
这个问题大部分人会想到先排序后遍历的解法,但是这个问题要求的时间复杂度是O(n)传统的排序并做不到
解法思路一:运用计数排序的思想
- 先求出原数组的最大值Max与最小值Min的区间长度k(k=Max-Min+1)。
- 创建一个长度为k的新数组Array。
- 遍历原数组,把原数组每一个元素插入到新数组Array对应的位置,比如元素的值为n,则插入到Array[n-min]当中。此时Array的部分位置为空,部分位置填充了数值。
- 遍历新数组Array,统计出Array中最大连续出现空值的次数+1,即为相邻元素最大差值。
public static int countSort(int[] nums) {
if (nums == null || nums.length < 2) {
return 0;
}
int maxInterval = 0;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int len = nums.length;
//保存原数组最大值和最小值
for (int i = 0; i < len; i++) {
max = Math.max(max, nums[i]);
min = Math.min(min, nums[i]);
}
//新数组长度区间
int[] newNums = new int[max - min + 1];
int bucketIndex = 0;
for (int i = 0; i < len; i++) {
bucketIndex = (nums[i] - min);
newNums[bucketIndex] = nums[i];
}
int lastMaxBucketValue = 0;
for (int i = 1; i < newNums.length; i++) {
//统计出Array中最大连续出现空值的次数
if (newNums[i] == 0) {
lastMaxBucketValue++;
if (lastMaxBucketValue > maxInterval) {
maxInterval = lastMaxBucketValue;
}
} else {
lastMaxBucketValue = 0;
}
}
//maxInterval+1即为所求
return maxInterval + 1;
}
但是当最大值和最小值相差巨大的时候,浪费了极大的空间,所以我们还要了解解法二
解法思路二:运用桶排序的思想
- 先求出原数组从最小值Min到最大值Max的单位区间长度d,d=(Max-Min+n+1)/n(此处运用(a+b+1)/b来获得a/b向上取整的结果)。算出d的作用是为了后续确定各个桶的区间范围划分。
- 创建一个长度是N+1的数组Array,数组的每一个元素都是一个List,代表一个桶。
- 遍历原数组,把原数组每一个元素插入到新数组Array对应的桶当中,进入各个桶的条件是根据不同的数值区间。由于桶的总数量是N+1,所以至少有一个桶是空的。
- 遍历新数组Array,计算每一个空桶右端非空桶中的最小值,与空桶左端非空桶的最大值的差,数值最大的差即为原数组排序后的相邻最大差值。(因为还要对每个桶排序才能得到最大值或者最小值,考虑到桶内排序的复杂度,我们可以做两个新数组,一个保存每个桶的最大值,一个保存每个桶的最小值,这样就免去了桶内排序的复杂度提升)
public static int bucketSort( int[] nums){
if(nums == null || nums.length < 2)
return 0;
int maxInterval = 0;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int len = nums.length;
//保存原数组最大值和最小值
for(int i = 0;i < len;i ++ ){
max = Math.max(max,nums[i]);
min = Math.min(min,nums[i]);
}
int[] maxs = new int[len + 1];
int[] mins = new int[len + 1];
int bucketIndex = 0;
for(int i = 0;i < len;i ++ ){
bucketIndex = (nums[i] - min) / ((max - min + len + 1)/len);
maxs[bucketIndex] = maxs[bucketIndex] == 0 ? nums[i] : Math.max(maxs[bucketIndex],nums[i]);
mins[bucketIndex] = mins[bucketIndex] == 0 ? nums[i] : Math.min(mins[bucketIndex],nums[i]);
}
int lastMaxBucketValue = maxs[0];
for(int i = 1;i < len + 1;i ++){
//获得当前非空桶最小值与上一个非空桶最大值的差值即为所求
if(mins[i] != 0){
maxInterval = Math.max(maxInterval,mins[i] - lastMaxBucketValue);
lastMaxBucketValue = maxs[i];
}
}
return maxInterval;
}
边栏推荐
- rhce第三天作业
- 网络安全第一次作业
- tinymce-plugins
- 苹果,与Web3 “八字不合”
- Summer training camp-week2 graph theory
- 机器学习——交叉验证法
- A number of embassies and consulates abroad have issued reminders about travel to China, personal and property safety
- Large and comprehensive pom file example
- 腾讯安全发布Tencent Cloud EdgeOne,为企业出海打造安全加速一体化服务
- SQL函数 UPPER
猜你喜欢
此次519暴跌的几点感触 2021-05-21
劲爆!阿里巴巴面试参考指南(嵩山版)开源分享,程序员面试必刷
mysql的case when如何用
攻防世界----unfinish
关于市场后市的发展预测? 2021-05-23
rhce第三天作业
The future of financial services will never stop, and the bull market will continue 2021-05-28
科研试剂DSPE-PEG-VIP,二硬脂酰基磷脂酰乙醇胺-聚乙二醇-血管活性肠肽VIP
Differences and concepts between software testing and hardware testing
巴比特 | 元宇宙每日必读:蒂芙尼宣布推出限量版 CryptoPunk 定制吊坠
随机推荐
Shell脚本完成pxe装机配置
web测试和app测试的区别?
The future of financial services will never stop, and the bull market will continue 2021-05-28
RHCE第一天作业
els long block deformation conditions, boundary collision judgment
网络安全第三次作业
Mysql 基本操作指南之mysql查询语句
HALCON: 对象(object)从声明(declaration)到结束(finalization)
标量替换、栈上分配、同步消除
基于深度学习的图像检索方法!
音频处理:浮点型数据流转PCM文件
Embedded system driver primary [2] - based on character device driver _ basic framework
MySQL - ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)
关于Google词向量模型(googlenews-vectors-negative300.bin)的导入问题
史上最全!47个“数字化转型”常见术语合集,看完秒懂~
Image retrieval method based on deep learning!
微信小程序如何实现支付功能?看官方文档头疼(使用云函数的方式操作)「建议收藏」
The world's largest Apache open source foundation is how it works?
WiFi Association & Omnipeek Packet Capture Analysis
数据机构---第六章图---图的遍历---选择题