当前位置:首页 > 力扣 > 力扣第1984题精解:如何通过排序将时间复杂度优化到O(n log n)?

力扣第1984题精解:如何通过排序将时间复杂度优化到O(n log n)?

4个月前 (05-14)

力扣第1984题精解:如何通过排序将时间复杂度优化到O(n log n)? C++ 力扣 数组 滑动窗口 算法 排序 第1张

题目解读

给定一个整数数组和一个整数 k,需要找到所有大小为 k 的子数组中最大值与最小值的差值的最小值。例如,数组 [9,4,1,7] 中若 k=2,则子数组有 [9,4](差为5)、[4,1](差为3)、[1,7](差为6),最终结果为3。题目要求通过排序和窗口滑动的思路,高效计算这一最小差值。


解题思路与过程

核心思路是通过排序简化差值计算,具体步骤如下:

1‌.降序排序数组‌:使用自定义比较函数 comp 将数组从大到小排序。降序排列后,每个连续的 k 元素的窗口中,第一个元素是窗口内的最大值,最后一个元素是最小值。

2‌.滑动窗口遍历‌:遍历所有可能的窗口(共 n - k + 1 个),计算当前窗口首尾元素的差值(即最大值与最小值的差),并记录全局最小差值。

3‌.特殊处理 k=1‌:此时所有子数组的差值为0,直接返回。

算法的时间复杂度主要由排序决定(O(n log n)),空间复杂度为 O(n)。通过排序将差值计算简化为首尾元素之差,避免了每个窗口重新遍历查找极值。


代码:

bool comp(int a, int b) { return a > b; }  // 自定义降序排序规则  

class Solution {  
public:  
    int minimumDifference(vector<int>& nums, int k) {  
        if (k == 1) {  // 特殊处理:k=1时差值为0  
            return 0;  
        }  
        int n = nums.size();  
        int newnums[1000];  // 声明临时数组(隐含长度限制)  
        for (int i = 0; i < n; i++) {  
            newnums[i] = nums[i];  // 复制原数组到临时数组  
        }  
        sort(newnums, newnums + n, comp);  // 降序排序  
        int minmum = 100001;  // 初始化为极大值  
        // 滑动窗口遍历所有k长度子数组  
        for (int i = 0; i < n - k + 1; i++) {  
            // 计算当前窗口首尾差值,并更新最小值  
            minmum = min(newnums[i] - newnums[i + k - 1], minmum);  
        }  
        return minmum;  
    }  
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣746:三步通关最小花费爬楼梯

力扣746:三步通关最小花费爬楼梯

题目解析:站在楼梯的某个台阶时,需要支付当前台阶对应的体力值cost[i],之后可以选择向上爬1或2个台阶。最终目标是到达‌楼层顶部‌(即数组末尾之后的位置),且初始位置可选择下标0或1的台阶作为起点...

力扣145:递归之美 轻松掌握二叉树后序遍历

力扣145:递归之美 轻松掌握二叉树后序遍历

题目解读二叉树的后序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。这种遍历方式特别适合需要先处理子节点再处理父节点的场景,如内存释放...

力扣第44题:寻找两个正序数组的中位数 - 合并排序解法详解

力扣第44题:寻找两个正序数组的中位数 - 合并排序解法详解

内容简介本文详细解析了力扣第44题"寻找两个正序数组的中位数"的合并排序解法。通过双指针技术合并两个有序数组,然后直接计算合并后数组的中位数。虽然时间复杂度为O(m+n),但这种方...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

一、题目解读洛谷1656题要求在无向图中找出所有割边(即删除后导致图不连通的边)。题目核心在于判断图的连通性,并识别哪些边是“桥”。需理解图论中的连通分量概念,以及如何通过算法高效定位割边。二、解题思...

洛谷2652题解析:同花顺排序问题的动态规划与滑动窗口优化

洛谷2652题解析:同花顺排序问题的动态规划与滑动窗口优化

一、题目解读洛谷2652题要求对一组扑克牌进行排序,目标是找到最少需要调整的次数,使得所有牌形成同花顺。题目中,扑克牌由花色和数字组成,需先按花色排序,再在同花色内按数字排序。核心难点在于如何处理花色...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。