1. Maximum Gap

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

Return 0 if the array contains less than 2 elements.

Example 1:

Input: [3,6,9,1]
Output: 3
Explanation: The sorted form of the array is [1,3,6,9], either
(3,6) or (6,9) has the maximum difference 3.

Example 2:

Input: [10]
Output: 0
Explanation: The array contains less than 2 elements, therefore return 0.

Note:

  • You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
  • Try to solve it in linear time/space.

解法1 \(O(n\log n)\)排序

class Solution {
public:
int maximumGap(vector<int>& nums) {
sort(nums.begin(), nums.end());
int res = 0;
for(int i = 1; i < nums.size(); ++i)res = max(res, nums[i]-nums[i-1]);
return res;
}
};

解法2 \(O(n)\)排序算法:桶排序、计数、基数。max-min可能会比较大,计数排序可能需要很大的空间,实现后发现会超时。

解法2.1 基数排序

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。

class Solution {
public:
int maximumGap(vector<int>& nums) {
if(nums.size() < 2)return 0;
radix_sort(nums);
int res = 0;
for(int i = 1; i < nums.size(); ++i)res = max(res, nums[i]-nums[i-1]);
return res;
}
void radix_sort(vector<int>& nums){
int maxVal = *max_element(nums.begin(), nums.end());
int exp = 1, radix = 10;
vector<int>aux(nums.size());
while(maxVal / exp > 0){
vector<int>cnt(radix, 0);
for(int i = 0; i < nums.size(); ++i){
int idx = (nums[i] / exp) % radix;
cnt[idx]++;
}
for(int i = 1; i < cnt.size(); ++i)cnt[i] += cnt[i-1];
for(int i = nums.size() - 1; i >= 0; --i){
aux[--cnt[(nums[i] / exp) % 10]] = nums[i];
}
for(int i = 0; i < nums.size(); ++i)nums[i] = aux[i];
exp *= 10;
}
}
};

解法2.2 桶排序

间隔为d,则\(\mathrm{d} \geq \frac{n\_max - n\_min}{n-1} = b\)。因此设置n-1个桶,桶高为\(b\),每个桶存储最小和最大的元素,最后依次比较使用过的相邻两个桶的间隔,取最大值

class Solution {
public:
int maximumGap(vector<int>& nums) {
if(nums.size() < 2)return 0;
int n_max = *max_element(nums.begin(), nums.end());
int n_min = *min_element(nums.begin(), nums.end()); int b = max(1, int((n_max - n_min) / (nums.size() - 1)));
vector<vector<int>>cnt(int((n_max - n_min) / b) + 1, vector<int>(2)); for(auto &v : cnt){
v[0] = INT_MAX;
v[1] = INT_MIN;
}
for(int x : nums){
int idx = floor((x - n_min) / b);
cnt[idx][0] = min(cnt[idx][0], x);
cnt[idx][1] = max(cnt[idx][1], x);
}
int res = 0;
int pre_max = cnt[0][1];
for(int i = 1; i < cnt.size(); ++i){
if(cnt[i][0] == INT_MAX)continue;
res = max(res, cnt[i][0] - pre_max);
pre_max = cnt[i][1];
}
return res;
}
};

【刷题-LeetCode】164 Maximum Gap的更多相关文章

  1. LeetCode 164. Maximum Gap[翻译]

    164. Maximum Gap 164. 最大间隔 Given an unsorted array, find the maximum difference between the successi ...

  2. leetcode[164] Maximum Gap

    梅西刚梅开二度,我也记一题. 在一个没排序的数组里,找出排序后的相邻数字的最大差值. 要求用线性时间和空间. 如果用nlgn的话,直接排序然后判断就可以了.so easy class Solution ...

  3. [LeetCode] 164. Maximum Gap 求最大间距

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

  4. ✡ leetcode 164. Maximum Gap 寻找最大相邻数字差 --------- java

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

  5. Java for LeetCode 164 Maximum Gap

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

  6. 【LeetCode】164. Maximum Gap (2 solutions)

    Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ...

  7. LeetCode刷题------------------------------LeetCode使用介绍

    临近毕业了,对技术有种热爱的我也快步入码农行业了,以前虽然在学校的ACM学习过一些算法,什么大数的阶乘,dp,背包等,但是现在早就忘在脑袋后了,哈哈,原谅我是一枚菜鸡,为了锻炼编程能力还是去刷刷Lee ...

  8. 【leetcode】Maximum Gap

    Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ...

  9. 【Leetcode】164. Maximum Gap 【基数排序】

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

随机推荐

  1. centos使用yum安装报错: 另一个应用程序是:PackageKit

    已加载插件:fastestmirror, langpacks/var/run/yum.pid 已被锁定,PID 为 13189 的另一个程序正在运行.Another app is currently ...

  2. JAVA在JDK1.8中Stream流的使用

    Stream流的map使用 转换大写 List<String> list3 = Arrays.asList("zhangSan", "liSi", ...

  3. VAE with a VampPrior

    目录 概 主要内容 分级的VAE 代码 Tomczak J. & Welling M. VAE with a VampPrior. In International Conference on ...

  4. CS5211设计EDP转LVDSA转接屏|替代LT7211|DP转LVDS屏驱动 转接板

    LT7211是一种用于虚拟现实/显示应用的高性能C/DP1.2至LVDS芯片. 对于DP1.2输入,LT7211可以配置为1.2.4车道,还支持车道交换功能.自适应均衡使其适用于长电缆应用,最大带宽可 ...

  5. Java初学者作业——完成对已定义类(Admin)的对象的创建。并完成属性的赋值和方法的调用。

    返回本章节 返回作业目录 需求说明: 完成对已定义类(Admin)的对象的创建.并完成属性的赋值和方法的调用. 实现思路: 创建 MyTest 类,并添加 main函数. 在 main函数中完成对 A ...

  6. 使用 JavaScript自定义函数计算出教室的体积大小,其中教室的长、宽、高分别为 8 米、5 米、3 米

    查看本章节 查看作业目录 需求说明: 使用 JavaScript自定义函数计算出教室的体积大小,其中教室的长.宽.高分别为 8 米.5 米.3 米 实现思路: 创建 HTML 页面 在页面的 < ...

  7. rabbimq集群搭建报错:Error: unable TO perform an operation ON node 'rabbit@test3'. Please see diagnostics information AND suggestions below.

    在搭建rabbitmq集群的时候,添加内存节点时,抛出异常:Error: unable TO perform an operation ON node 'rabbit@test3'. Please s ...

  8. Swoole 中使用 TCP 异步服务器、TCP 协程服务器、TCP 同步客户端、TCP 协程客户端

    TCP 异步风格服务器 异步风格服务器通过监听事件的方式来编写程序.当对应的事件发生时底层会主动回调指定的函数. 由于默认开启协程化,在回调函数内部会自动创建协程,遇到 IO 会产生协程调度,异步风格 ...

  9. 深入 Laravel 内核之 PHP 反射机制和依赖注入

    结论: PHP中提供了反射类来解析类的结构: 通过反射类可以获取到类的构造函数及其参数和依赖: 给构造函数的参数递归设置默认值后,即可使用这些带默认值的参数通过 newInstanceArgs 实例化 ...

  10. Flask_上下文(六)

    Flask中有两种上下文,应用上下文(application context)和请求上下文(request context) 当客户端发来请求时,请求上下文就登场了.请求上下文里包含了请求的各种信息, ...