Leetcode力扣 No.15 三数之和

1.题目链接

2.题目描述

题目

算法

本题的难点在于如何去除重复解。
算法流程:
在这里插入图片描述
复杂度分析
在这里插入图片描述

双指针法:
类似2sum, 不过是这次是求和为 - nums[i]的两个数.

先对数组进行排序(增序), 双指针从两侧遍历, 若和大于-nows[i], 右指针向左走,否则左指针向右走.
为什么大于时不是左指针向左走呢? 因为左指针相对于右指针更靠近开头, 如果左指针向左走, 容易碰到now元素(low和high始终都在now的后面)而结束, 所以为了效率让右指针向左走. 小于情况相同.

注意重复的情况要去重.

代码

Python3

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        n = len(nums)
        res = []
        if(not nums or n<3):
            return []
        nums.sort()
        res = []
        for i in range(n):
            if(nums[i] > 0):
                return res
            if(i>0 and nums[i]==nums[i-1]):
                continue #跳过
            L = i + 1
            R = n - 1
            while(L<R):
                if(nums[i] + nums[L] + nums[R]==0):
                    res.append([nums[i],nums[L],nums[R]])
                    #去重,待定数不变找下一个答案
                    while(L<R and nums[L]==nums[L+1]):
                        L = L + 1
                    while(L<R and nums[R] == nums[R-1]):
                        R = R + 1
                    L = L + 1
                    R = R - 1
                elif(nums[i] + nums[L] + nums[R] > 0):
                    R = R - 1
                else:
                    L = L + 1
        return res   #对齐

C++

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
        int N = nums.size();
        if(N < 3)
            return {};

        const int target = 0;
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());

        for(int i = 0; i < N - 2; ++i)
        {
            if(nums[i] > target)
                break;
            if(i > 0 && nums[i] == nums[i - 1])
                continue;
            int left = i + 1, right = N - 1;
            while(left < right)
            {
                if(nums[i] + nums[left] + nums[right] == target)
                {
                    res.push_back({nums[i], nums[left], nums[right]});
                    cout << nums[i] << " " << nums[left] << " " << nums[right] << endl;

                    while(left < right && nums[left + 1] == nums[left])
                        left++;
                    while(left < right && nums[right - 1] == nums[right])
                        right--;
                    
                    left++;
                    right--;
                }
                else if(nums[i] + nums[left] + nums[right] > target)
                    right--;
                else
                    left++;
            }
            
        }
        return res;
    }
};

将res在函数外全局定义, 能减少内存.

使用优化算法,以优化VMD算法的惩罚因子惩罚因子 (α) 和分解层数 (K)。 1、将量子粒子群优化(QPSO)算法与变分模态分解(VMD)算法结合 VMD算法背景: VMD算法是一种自适应信号分解算法,主要用于分解信号为不同频率带宽的模态。 VMD的关键参数包括: 惩罚因子 α:控制带宽的限制。 分解层数 K:决定分解出的模态数。 QPSO算法背景: 量子粒子群优化(QPSO)是一种基于粒子群优化(PSO)的一种改进算法,通过量子行为模型增强全局搜索能力。 QPSO通过粒子的量子行为使其在搜索空间中不受位置限制,从而提高算法的收敛速度与全局优化能力。 任务: 使用QPSO优化VMD中的惩罚因子 α 和分解层数 K,以获得信号分解的最佳效果。 计划: 定义适应度函数:适应度函数根据VMD分解的效果来定义,通常使用重构信号的误差(例如均方误差、交叉熵等)来衡量分解的质量。 初始化QPSO粒子:定义粒子的位置和速度,表示 α 和 K 两个参数。初始化时需要在一个合理的范围内为每个粒子分配初始位置。 执行VMD分解:对每一组 α 和 K 参数,运行VMD算法分解信号。 更新QPSO粒子:使用QPSO算法更新粒子的状态,根据适应度函数调整粒子的搜索方向和位置。 迭代求解:重复QPSO的粒子更新步骤,直到满足终止条件(如适应度函数达到设定阈值,或最大迭代次数)。 输出优化结果:最终,QPSO算法会返回一个优化的 α 和 K,从而使VMD分解效果最佳。 2、将极光粒子(PLO)算法与变分模态分解(VMD)算法结合 PLO的优点与适用性 强大的全局搜索能力:PLO通过模拟极光粒子的运动,能够更高效地探索复杂的多峰优化问题,避免陷入局部最优。 鲁棒性强:PLO在面对高维、多模态问题时有较好的适应性,因此适合海上风电时间序列这种非线性、多噪声的数据。 应用场景:PLO适合用于优化VMD参数(α 和 K),并将其用于风电时间序列的预测任务。 进一步优化的建议 a. 实现更细致的PLO更新策略,优化极光粒子的运动模型。 b. 将PLO优化后的VMD应用于真实的海上风电数据,结合LSTM或XGBoost等模型进行风电功率预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值