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

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

2周前 (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;  
    }  
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第2题:三步掌握递归解法与进位传递技巧

力扣第2题:三步掌握递归解法与进位传递技巧

给定两个非空链表,每个链表代表一个非负整数。数字按照逆序存储(如整数 342 存储为 2→4→3),要求将这两个数相加并以相同形式的链表返回结果。例如输入 2→4→3 和 5→6→4,它们的和是 80...

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化

题目重解需要将密码字符串从第target个字符开始进行重新排列,形成新的动态密码。例如输入"password"和target=3,结果应为"swordpas"。...

力扣第92题:三步定位 精准反转链表指定区间

力扣第92题:三步定位 精准反转链表指定区间

题目解读给定一个单链表和两个整数left与right,要求将链表中从第left个节点到第right个节点的部分进行反转,而保持其他部分不变。例如,对于链表1→2→3→4→5,left=2,right=...

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

题目重解给定一个仅包含'L'和'R'的字符串,要求将其分割成尽可能多的子串,且每个子串中'L'和'R'的数量相等。例如输入"R...

【深度优先搜索实战】力扣547题:省份数量问题的图论解法

【深度优先搜索实战】力扣547题:省份数量问题的图论解法

题目解读‌我们面对的是一个典型的图论问题:给定一个城市的连接矩阵,需要计算其中相互连通的城市群(省份)数量。这个问题可以抽象为无向图中的连通分量计算,每个城市代表图中的一个节点,城市之间的连接关系代表...

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

一:重新解读题目泰波那契数列是一个充满数学趣味的递推序列:从第3项开始,每个数均为前三个数的和(即Tₙ₊₃ = Tₙ + Tₙ₊₁ + Tₙ₊₂)。当给定整数n时,需要高效计算出第n项的值。面对此类递...

发表评论

访客

看不清,换一张

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