当前位置:首页 > 力扣 > 力扣第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;  
    }  
};


原创内容 转载请注明出处

分享给朋友:

相关文章

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

题目重解我们面对一个经典背包问题的变体:给定n个物品,每个物品有重量w和价值v,背包容量为V。需要回答两个问题:1) 普通情况下能获得的最大价值;2) 必须恰好装满背包时的最大价值(若无法装满则输出0...

力扣654:递归分治的艺术 如何用最大元素构建二叉树

力扣654:递归分治的艺术 如何用最大元素构建二叉树

题目重解我们面对一个看似简单却充满递归魅力的题目:给定一个不含重复元素的整数数组,需要构建一棵特殊的二叉树。这个树的每个父节点都必须是当前子数组中的最大元素,而它的左右子树则分别由该最大值左侧和右侧的...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

一、题目解读洛谷1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的算法求解最优策略。二、解题思路1. 动态规划 +...

牛客NC67题解:汉诺塔递归算法与解题步骤

牛客NC67题解:汉诺塔递归算法与解题步骤

一、题目解读牛客NC67题要求解决汉诺塔问题,这是一个经典的递归算法题目。题目给定整数n,代表汉诺塔中的盘子数量,需要输出将n个盘子从起始柱移动到目标柱的所有步骤。汉诺塔问题规则为:每次只能移动一个盘...

发表评论

访客

看不清,换一张

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