【刷题-LeetCode】164 Maximum Gap
- 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的更多相关文章
- LeetCode 164. Maximum Gap[翻译]
164. Maximum Gap 164. 最大间隔 Given an unsorted array, find the maximum difference between the successi ...
- leetcode[164] Maximum Gap
梅西刚梅开二度,我也记一题. 在一个没排序的数组里,找出排序后的相邻数字的最大差值. 要求用线性时间和空间. 如果用nlgn的话,直接排序然后判断就可以了.so easy class Solution ...
- [LeetCode] 164. Maximum Gap 求最大间距
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- ✡ leetcode 164. Maximum Gap 寻找最大相邻数字差 --------- java
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- Java for LeetCode 164 Maximum Gap
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- 【LeetCode】164. Maximum Gap (2 solutions)
Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ...
- LeetCode刷题------------------------------LeetCode使用介绍
临近毕业了,对技术有种热爱的我也快步入码农行业了,以前虽然在学校的ACM学习过一些算法,什么大数的阶乘,dp,背包等,但是现在早就忘在脑袋后了,哈哈,原谅我是一枚菜鸡,为了锻炼编程能力还是去刷刷Lee ...
- 【leetcode】Maximum Gap
Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ...
- 【Leetcode】164. Maximum Gap 【基数排序】
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
随机推荐
- CF652B z-sort 题解
Content 定义一个数组是 \(\text{Z}\) 排序过的,当且仅当: 对于所有的 \(i=2k+1(k\in\mathbb Z)\),\(a_i\leqslant a_{i-1}\). 对于 ...
- Python的动态语言特性; __slots__属性
python是动态语言 1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被 ...
- JAVA使用多线程进行数据处理
import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.Log ...
- nim_duilib(20)之即刻(1)
note 一个基于nim_duilib仿wechat的IM. 主界面 样式 美工差了. 布局 整体为水平布局,左边的深灰色区域(frame_left),右侧的light white区域(frame_r ...
- 【LeetCode】15. 3Sum 三数之和
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:3sum, 三数之和,题解,leetcode, 力扣,P ...
- 【LeetCode】687. Longest Univalue Path 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetco ...
- 【剑指Offer】旋转数组中的最小数字 解题报告(Python)
[剑指Offer]旋转数组中的最小数字 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...
- TKE用户故事 | 作业帮检索服务基于Fluid的计算存储分离实践
作者 吕亚霖,2019年加入作业帮,作业帮基础架构-架构研发团队负责人,在作业帮期间主导了云原生架构演进.推动实施容器化改造.服务治理.GO微服务框架.DevOps的落地实践. 张浩然,2019年加入 ...
- Redis的各种实现(Jedis、Redisson、Lettuce)
1.1.Jedis 是Redis的Java实现的客户端.支持基本的数据类型如:String.Hash.List.Set.Sorted Set. 特点:使用阻塞的I/O,方法调用同步,程序流需要等到so ...
- CS5266 Type-C转HDMI+PD3.0+USB3.0 三合一拓展坞电路设计
CS5266 Type-C转HDMI+PD3.0+USB3.0 三合一拓展坞电路设计 CS5266是一款带PD3.0快充 Type-C转HDMI 4K30HZ音视频转换芯片.CS5266支持PD3.0 ...