Given an unsorted array, find the maximum difference between the successive elements in its sorted form.

Try to solve it in linear time/space.

Return 0 if the array contains less than 2 elements.

You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.

代码一(简单易懂版):

桶排序,由于num中的数字肯定在[min,max]区间内,所以根据抽屉原理,假设num中有n个数字,则最大的gap必然要大于dis=(max- min)/(n-1),所以我们可以把num所在的范围分成等间隔的区间,相邻区间内的元素之间的最大差值,即为要寻找的gap。

 class Solution {
public:
int maximumGap(vector<int> &num) {
int n = num.size();
if (n < ) return ;
if (n == ) return abs(num[] - num[]);
int imin = num[], imax = num[];
for (int i = ; i < n; ++i) {
imin = min(imin, num[i]);
imax = max(imax, num[i]);
}
int dist = (imax-imin) / n + ;
vector<vector<int> > bucket((imax-imin)/dist + );
int idx;
for (int i = ; i < n; ++i) {
idx = (num[i] - imin) / dist;
if (bucket[idx].empty()) {
bucket[idx].push_back(num[i]);
bucket[idx].push_back(num[i]);
} else {
bucket[idx][] = min(bucket[idx][], num[i]);
bucket[idx][] = max(bucket[idx][], num[i]);
}
}
int gap = , pre = , tmp;
for (int i = ; i < bucket.size(); ++i) {
if (bucket[i].empty()) continue;
tmp = bucket[i][] - bucket[pre][];
gap = max(gap, tmp);
pre = i;
}
return gap;
}
};

代码二(刚开始我看的一直是这个,代码风格虽然很好,但是不好理解):

这里要用到桶排序,感觉不太感兴趣,就直接看了网上的做法。

(ps:后来才知道,桶排序是基数排序的基础)

C++中vector中的一些常用函数:

取容器中的最大最小值min_element(),max_element()。

当有必要对一个接受pair参数的函数传递两个值时, make_pair()尤其显得方便。

int minAll = *min_element(nums.begin(), nums.end());

int maxAll = *max_element(nums.begin(), nums.end());

vector<pair<int, int> > buckets(bucketCount, make_pair(INT_MIN, INT_MAX));

应用桶排序的思想,把数组元素归到桶中。在一个桶内,元素差小于等于block.max-block.min。在两桶之间,元素差等于block2.min-block1.max。 
// 用桶排序
// 算出相邻两个桶之间的最大差值
// 如果是平均分布,则桶的数目和元素的数目相同时,其排序的时间复杂度是0(n)
// 我们假设桶的个数和元素的数目相同,若是平均分布,则每个桶里有一个数,而若某个桶里有两个以上的桶时,这时必有至少一个是空桶,那么最大间隔可能就落在空桶的相邻两个桶存储的数之间,最大间隔不会落在同一个桶的数里,因此我们不需要对每个桶再排一次序,只需要记录同一个桶的最大值和最小值,算出前一个有最大值的桶和后一个有最小值的桶之差,则可能是最大间隔
//步骤:1.算好用的桶的个数,用最大元素和最小元素算出平均间隔,记录在平均间隔上的最大值和最小值,
// 2. 再算出前一个间隔里的最大值和后一个间隔里的最小值之差,取最大的一个,
// 3. 再算出最小值和第二小的差(平均间隔最小值第一个),最大值和第二大(平均间隔最大值最后一个)的差,三个值相比,取最大的,就是最大间隔
class Solution {
public:
int maximumGap(vector<int>& nums) {
if (num.size() < ) return ;
// 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()-)); // 平均间隔
int bucketCount = ceil((double)(maxVal - minVal) / agGap);
// 2. 记录每个桶的最大值和最小值
vector<pair<int, int> > 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(), 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; }
};
												

最新文章

  1. javascript数据结构与算法---列表
  2. PHP 错误与异常 笔记与总结(7)将错误日志以邮件方式发送
  3. HDU_1241 Oil Deposits(DFS深搜)
  4. sts 去掉启动的rss功能
  5. String StringBuffer StringBuilder (转)
  6. 通过案例掌握Spring 管理事务的步骤及配置
  7. A Simple Math Problem(矩阵快速幂)(寒假闭关第一题,有点曲折啊)
  8. 使用spark ml pipeline进行机器学习
  9. VirtualBox Network Config
  10. WPF线程中获取控件的值和给控件赋值
  11. linux-安装jdk以及tomcat
  12. BZOJ5019 SNOI2017遗失的答案(容斥原理)
  13. Struts2环境搭建及实例解析
  14. C#调整图片亮度和对比度
  15. java多线程获取返回结果--Callable和Future示例
  16. python中 .write 无法向文件写入内容
  17. HDU 1199 &amp;amp;&amp;amp; ZOJ 2301 线段树离散化
  18. 前端优化点(此文转载 http://mp.weixin.qq.com/s/6mVVKmqDL_xYl15AeoJTWg)
  19. iOS文件路径相关的方法
  20. 引入 netty网关,向flume提交数据

热门文章

  1. bzoj1778: [Usaco2010 Hol]Dotp 驱逐猪猡(概率DP+高斯消元)
  2. 关于web.xml中的&lt;welcome-file-list&gt;中的默认首页资料
  3. JS设计模式之装饰者模式
  4. 仿微信中加载网页时带线行进度条的WebView的实现
  5. Maven -- 将引用的本地jar文件打进war包里
  6. photoshop的魔棒工具怎么用来抠图
  7. 【BZOJ4816】【SDOI2017】数字表格 [莫比乌斯反演]
  8. [BZOJ1087][SCOI2005]互不侵犯King解题报告|状压DP
  9. bzoj 1503 平衡树
  10. 【转】jpg文件格式详解