leetcode.164


LeetCode 164.最大间距

1 题目描述

给定一个无序的数组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 <= nums.length <= 10^5
  • 0 <= nums[i] <= 10^9

2 思路

由于题目中要求必须要线性时间,且使用线性空间,因而不能采用传统的排序(快排的时间复杂度为nlogn),我们可以用基数排序的方法,其时间复杂度和空间复杂度均为线性的。

//基数排序
void radixSort(int *nums, int numsSize, int exp){
    int buf[numsSize], bucket[10] = {0};
    for(int i = 0; i < numsSize; i++){
        bucket[(nums[i]/exp)%10] += 1;              //将每个nums放到对应的桶中
    }
    for(int i = 1; i < 10; i++){
        bucket[i] += bucket[i-1];                   //前缀和,确定每个nums的先后顺序
    }
    for(int i = numsSize - 1; i >= 0; i--){
        buf[bucket[(nums[i]/exp)%10]-1] = nums[i];  //将nums从桶中取出并暂存到buf数组中
        bucket[(nums[i]/exp)%10] -= 1;
    }
    for(int i = 0; i < numsSize; i++){
        nums[i] = buf[i];                           //将排序结果返回至原数组
    }
}

int maximumGap(int* nums, int numsSize){
    int max = INT_MIN;
    for(int i = 0; i < numsSize; i++){
        max = fmax(max, nums[i]);   //找最大元素以确定需要进行多少次排序操作
    }
    int exp = 1;                    //先对个位进行排序
    while(max >= exp){              //逐位进行基数排列
        radixSort(nums, numsSize, exp);
        exp *= 10;                  //切换操作位,个位、十位、千位...
    }
    int ans = 0;
    for(int i = 1; i < numsSize; i++){
        ans = fmax(ans, nums[i] - nums[i-1]);
    }
    return ans;
}

文章作者: Vyron Su
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Vyron Su !