leetcode003-Kth Largest Element in an Array

本文介绍了一种高效的算法来找出未排序数组中的第K大元素,采用分治策略,通过随机选择基准值并划分数组,逐步缩小搜索范围直至找到目标元素。

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.

For example,
Given [3,2,1,5,6,4] and k = 2, return 5.

Note: 

You may assume k is always valid, 1 ≤ k ≤ array's length.

这是一道分治的经典题目,不通过排序将第k大的数字找出来。

基本思路:随机选定一个pivot,从而将数组分成三部分,分别是A小于pivot,B等于pivot和C大于pivot的部分。然后通过比较k与三个部分的长度,可以减少搜索的范围。通过不断减少搜索范围直到找到第k个数。

具体规则:1.k<=A.size,就变成在A中寻找第k大数

                  2.k>A.size && k <= A.size+B.size, 那么当前的pivot就是第k大数

                  3.剩下的情况是第k大数出现在C中,就变成在C中寻找第k-A.size+B.size大的数


主要的思路不难,选择这道题主要是为了尝试实现不通过另外申请空间,原地将数组分成三个部分。

我的实现思路是:1.用less指针指着数组头部,用more指针指着数组尾部,equal指针初始化为n。(下标为0到n-1)

                             2.如果less<=more,检查less指针的元素l,否则结束

                              2.1如果l小于选定的pivot,那么less+1往右移一格,再次进行2;

                                2.2如果l大于等于选定的pivot,则无论more指着什么,都将l与more指着的元素交换,然后进行3

                             3.检查交换过来的元素l:

                                3.1如果l大于pivot,那么more-1往左移一格,再次进行2;

                                3.2如果l等于pivot,那么将l与(equal-1)指着的元素进行交换,然后equal-1往左移动,more-1往左移动,再次进行2

以下是AC的代码

 

int findKthLargest(vector<int>& nums, int k) {
        int n = nums.size();
        k = n-k+1;  // 将求第k大转为求第k'小
        int less = 0;
        int more = n-1;
        int equal = n;
        int sl, sr, sv,v, start, end;
        while (1) {
            start = less;  //记下每次搜索数组的起始和结束位置
            end = more;
            n = equal;
            v = nums[less]; // pivot
            if (start == end) return v;
            while (less != more) {
                if (nums[less] < v) {
                    less++;
                } else {
                    if (less != more)
                        swap(nums[less],nums[more]);
                    if (nums[more] > v) {
                        more--;
                    } else {
                        equal--;
                        if (equal != more)
                            swap(nums[equal],nums[more]);
                        more--;
                    }
                }
            }
            sv = n-equal;
            sl = nums[less] < v ? less-start+1 : less-start;
            sr = nums[less] < v ? equal-more-1 : equal-more;
            if (k <= sl+sv && k >sl) {
                return v;
            } else if (k <= sl) {
                less = start;
                more = (nums[more] >= v) ? more-1:more;
                equal = more+1;
            } else {
                k = k-sl-sv;
                less = (nums[more] < v) ? less+1:less;
                more = equal-1;
            }
        }
        return -1;
    }

【负荷预测】基于VMD-CNN-LSTM的负荷预测研究(Python代码实现)内容概要:本文介绍了基于变分模态分解(VMD)、卷积神经网络(CNN)和长短期记忆网络(LSTM)相结合的VMD-CNN-LSTM模型在负荷预测中的研究与应用,采用Python代码实现。该方法首先利用VMD对原始负荷数据进行分解,降低序列复杂性并提取不同频率的模态分量;随后通过CNN提取各模态的局部特征;最后由LSTM捕捉时间序列的长期依赖关系,实现高精度的负荷预测。该模型有效提升了预测精度,尤其适用于非平稳、非线性的电力负荷数据,具有较强的鲁棒性和泛化能力。; 适合人群:具备一定Python编程基础和深度学习背景,从事电力系统、能源管理或时间序列预测相关研究的科研人员及工程技术人员,尤其适合研究生、高校教师及电力行业从业者。; 使用场景及目标:①应用于日前、日内及实时负荷预测场景,支持智慧电网调度与能源优化管理;②为研究复合型深度学习模型在非线性时间序列预测中的设计与实现提供参考;③可用于学术复现、课题研究或实际项目开发中提升预测性能。; 阅读建议:建议读者结合提供的Python代码,深入理解VMD信号分解机制、CNN特征提取原理及LSTM时序建模过程,通过实验调试参数(如VMD的分解层数K、惩罚因子α等)优化模型性能,并可进一步拓展至风电、光伏等其他能源预测领域。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值