大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。
一、题目
1、算法题目
“给定一个无需数组,返回数组排序后,相邻元素之间最大差值。”
2、题目描述
给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。
您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。
示例 1: 输入: nums = [3,6,9,1] 输出: 3 解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2: 输入: nums = [10] 输出: 0 解释: 数组元素个数小于 2,因此返回 0。
二、解题
1、思路分析
题意要求将数组排序后,再找出最大间距。
对于传统的排序算法来说,都需要O(N log N)的时间复杂度,要将时间复杂度降到O(N),就必须使用其他算法。
比如使用基数排序就可以将时间复杂度降到O(N)。
2、代码实现
代码参考:
class Solution { public int maximumGap(int[] nums) { int n = nums.length; if (n < 2) { return 0; } long exp = 1; int[] buf = new int[n]; int maxVal = Arrays.stream(nums).max().getAsInt(); while (maxVal >= exp) { int[] cnt = new int[10]; for (int i = 0; i < n; i++) { int digit = (nums[i] / (int) exp) % 10; cnt[digit]++; } for (int i = 1; i < 10; i++) { cnt[i] += cnt[i - 1]; } for (int i = n - 1; i >= 0; i--) { int digit = (nums[i] / (int) exp) % 10; buf[cnt[digit] - 1] = nums[i]; cnt[digit]--; } System.arraycopy(buf, 0, nums, 0, n); exp *= 10; } int ret = 0; for (int i = 1; i < n; i++) { ret = Math.max(ret, nums[i] - nums[i - 1]); } return ret; } }
3、时间复杂度
时间复杂度:O(N)
其中N是数组的长度。
空间复杂度:O(N)
其中N是数组的长度。
三、总结
这道题就是讲数组排序后,然后得到相邻元素的最大差值。
但是使用普通的排序方式,时间复杂度比较高,所以使用了不基于比较的排序算法也就是基数排序。
才能使用线性时间复杂度解决。