题目描述
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.
题目大意
给定一个乱序数组,要求找到该数组在有序情况下相邻两数字最大差值。
要求:在O(n)时间复杂度以及空间复杂度内完成。
示例
E1
Input: [3,6,9,1] Output: 3
E2
Input: [10] Output: 0
解题思路
最简单的方法是先将数组排序,再遍历一遍可得到最后结果。
感谢LeetCode@zkfairytale的代码得到效率更好的代码。
由于最终结果的差值大小一定 >= bucket_size = (max - min) / (n - 1),其中max为数组中最大值,min为最小值,n为数组元素个数,可将所有数字分配在各个大小为bucket_size的桶中。由上述条件可知,最终结果一定大于等于bucket_size,因此可以遍历两个相邻bucket之间的最大值与最小值来获得可能的最大的差值。
复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)
代码
class Solution { public: int maximumGap(vector<int>& nums) { int n = nums.size(); if(n < 2) return 0; int maxn = INT_MIN, minn = INT_MAX, gap = 0; //寻找数组中的最大值与最小值 for(int num : nums) { maxn = max(maxn, num); minn = min(minn, num); } //计算bucket的长度大小 gap = (int)ceil((double)(maxn - minn) / (n - 1)); vector<int> bucketMax(n - 1, INT_MIN); vector<int> bucketMin(n - 1, INT_MAX); //保存每个归属于该bucket中的数值的最大值与最小值 for(int num : nums) { if(num == minn || num == maxn) continue; int idx = (num - minn) / gap; bucketMax[idx] = max(bucketMax[idx], num); bucketMin[idx] = min(bucketMin[idx], num); } int ans = INT_MIN, pre = minn; //寻找相邻两个bucket之间的可能的最大差值 for(int i = 0; i < n - 1; i++) { if(bucketMax[i] == INT_MIN || bucketMin[i] == INT_MAX) continue; ans = max(ans, bucketMin[i] - pre); pre = bucketMax[i]; } //判断最后两个bucket之间的最大差值 ans = max(ans, maxn - pre); return ans; } };