题目描述
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(log(n))
空间复杂度:O(1)
代码
class Solution { public: int findPeakElement(vector<int>& nums) { return solve(nums, 0, nums.size() - 1); } //二分搜索 int solve(vector<int>& nums, int low, int high) { if(low == high) return low; int mid1 = (low + high) / 2; int mid2 = mid1 + 1; //寻找两个较大的数字之间的数字的位置 if(nums[mid1] > nums[mid2]) return solve(nums, low, mid1); else return solve(nums, mid2, high); } };