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. powerdesigner给列加上注释步骤

    powerdesigner给列加上注释步骤如图:

  2. Windows 11实现录屏直播,搭建Nginx的rtmp服务

    先!下载几个工具呗 官方下载FFmpeg:http://www.ffmpeg.org 官方下载nginx-rtmp-module:https://github.com/arut/nginx-rtmp- ...

  3. 基于GDI和D3D的抓屏技术

    GDI32Api.Direct3D屏幕截图 最近因为工作需要,认真研究了一下屏幕截图的方法. 最主要的方法有两种,一.调用windows GDI32 API函数.二.使用DirectX9.0来实现. ...

  4. JAVA把InputStream 转 字节数组(byte[])

    import org.apache.commons.io.IOUtils; byte[] bytes = IOUtils.toByteArray(inputStream); 如果没有这个包 就加下依赖 ...

  5. 【LeetCode】66. Plus One 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数九 采用进位 日期 [LeetCode] 题目地址 ...

  6. 【LeetCode】1007. Minimum Domino Rotations For Equal Row 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历一遍 日期 题目地址:https://leetc ...

  7. Pikachu漏洞练习-SQL-inject(二)

     

  8. 简单的 for 循环也会踩的坑

    前言 最近实现某个业务时,需要读取数据然后再异步处理:在 Go 中实现起来自然就比较简单,伪代码如下: list := []*Demo{{"a"}, {"b"} ...

  9. Shell实现文件内容批量替换的方法

    在Linux系统中,文件内容的批量替换同Windows平台相比要麻烦一点.不过这里可以通过Shell命令或脚本的方式实现批量替换的功能. 笔者使用过两个命令:perl和sed ,接下来会对其做出说明. ...

  10. Service有多个实现类,它怎么知道该注入哪个ServiceImpl类

    方法一:Controller中注入service的时候使用@Autowired自动注入,@Qualifier("beanId")来指定注入哪一个. 方法二:Controller中注 ...