博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode——Maximum Gap
阅读量:5216 次
发布时间:2019-06-14

本文共 1849 字,大约阅读时间需要 6 分钟。

    想了一晚上没想明白,上网搜了别人的答案。。。研究了好几个晚上才觉得有点明悟了。。。

下面是详细思考的过程:()

class Solution {public:    // 用桶排序    // 算出相邻两个桶之间的最大差值    // 如果是平均分布,则桶的数目和元素的数目相同时,其排序的时间复杂度是0(n)    // 我们假设桶的个数和元素的数目相同,若是平均分布,则每个桶里有一个数,而若某个桶里有两个以上的桶时,这时必有至少一个是空桶,那么最大间隔可能就落在空桶的相邻两个桶存储的数之间,最大间隔不会落在同一个桶的数里,因此我们不需要对每个桶再排一次序,只需要记录同一个桶的最大值和最小值,算出前一个有最大值的桶和后一个有最小值的桶之差,则可能是最大间隔    //步骤:1.算好用的桶的个数,用最大元素和最小元素算出平均间隔,记录在平均间隔上的最大值和最小值,    // 2. 再算出前一个间隔里的最大值和后一个间隔里的最小值之差,取最大的一个,    // 3. 再算出最小值和第二小的差(平均间隔最小值第一个),最大值和第二大(平均间隔最大值最后一个)的差,三个值相比,取最大的,就是最大间隔    int maximumGap(vector
&num) { if (num.size() < 2) return 0; // 1. 算出用的桶数:取平均间隔,再用最大值和最小值之差除以间隔,得到桶数 // 因为假设所有值都是平均分布的时候,如此取桶数可得时间复杂度是0(n) auto maxVal = *max_element(num.begin(), num.end()); auto minVal = *min_element(num.begin(), num.end()); int agGap = ceil((double)(maxVal - minVal) / (num.size()-1)); // 平均间隔 int bucketCount = ceil((double)(maxVal - minVal) / agGap); // 2. 记录每个桶的最大值和最小值 vector
> buckets(bucketCount, make_pair(INT_MIN, INT_MAX)); // 初始化桶 for (auto val : num){ if (val == maxVal || val == minVal) continue; int bucketNum = (val - minVal) / agGap; if (val > buckets[bucketNum].first) buckets[bucketNum].first = val; // 存储最大值 if (val < buckets[bucketNum].second) buckets[bucketNum].second = val; // 存储最小值 } // 3. 算出最大间隔 int maxGap(0), lastMax(minVal); for (auto bucket : buckets){ if (bucket.first == INT_MIN) continue; // 空桶 int curMax(bucket.first), curMin(bucket.second); maxGap = max(maxGap, curMin - lastMax); lastMax = curMax; } maxGap = max(maxGap, maxVal - lastMax); return maxGap; }};

转载于:https://www.cnblogs.com/skysand/p/4179099.html

你可能感兴趣的文章
dd测试硬盘性能
查看>>
【转】Android 内存回收机制(默认回收与kernel回收)
查看>>
Visual Studio 2013 新增功能:“Browser Link”
查看>>
[IDEA]IDEA体验式使用
查看>>
DPDK架构与特点
查看>>
The SO_REUSEPORT socket option
查看>>
使用ffmpeg编码时,如何设置恒定码率,并控制好关键帧I帧间隔
查看>>
2016年11月4日运算符与语句
查看>>
Windows批处理命令学习中遇到的坑--持续更新中
查看>>
测试工程师养成记
查看>>
广度优先搜索(二)
查看>>
网线制作
查看>>
System.String是不可变的字符串吗?
查看>>
库函数qsort使用示范
查看>>
codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点
查看>>
Codeforces Round #292 (Div. 1) B. Drazil and Tiles 拓扑排序
查看>>
linux set
查看>>
vim lua对齐indent无效
查看>>
Python中的MySQL接口:PyMySQL & MySQLdb
查看>>
输入格式CombineFileInput
查看>>