跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

贪心算法实战:摆动序列与股票买卖

贪心算法强调在每一步做出当前看起来最好的选择,从而期望达到全局最优。本文通过四道 LeetCode 经典题解析该策略:摆动序列利用差值符号变化判断极值点;递增三元子序列维护两个最小变量以寻找递增关系;最长连续递增序列通过单次遍历统计长度;股票买卖问题则动态更新历史最低价以计算最大利润。这些案例展示了如何在不同场景下应用贪心思想解决实际问题。

WenxuanMa发布于 2026/3/23更新于 2026/10/1897 浏览
贪心算法实战:摆动序列与股票买卖

贪心算法核心思路

贪心算法的核心在于局部最优推导全局最优,但这往往需要经验积累。通过几道经典题目,我们可以更直观地理解这种策略在实际编码中的应用。

LeetCode 376. 摆动序列

这道题要求找出最长的摆动子序列。所谓摆动序列,就是相邻元素的差值正负交替。为了得到最长序列,我们在每一步选择时都应尽可能让当前极值点成为波峰或波谷,这样后续的选择空间才最大。

文章配图

看上面的图,假设在 c 和 d 之间选了一个非极值点 x1,那么后续可能就无法满足摆动条件了。这就是为什么我们要选极值点的原因。代码实现上,我们可以通过比较相邻元素的差值符号变化来判断极值点位置。

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int left = 0;
        int right = 0;
        int sz = nums.size();
        int ret = 0;
        
        // 特判边界情况
        if (sz == 1 || (sz == 2 && nums[0] == nums[1])) return 1;
        if ((nums[0] == nums[sz - 1]) && (nums[0] == nums[sz / 2])) return 1;
        
        for (int i = 0; i < sz - 1; ++i) {
            right = nums[i + 1] - nums[i];
            if (!right) continue; // 跳过相同元素
            
            // 符号改变说明出现极值点
            if ((left * right) < 0) {
                ret++;
            }
            left = right;
        }
        return ret + 2; // 加上首尾两个端点
    }
};

注意这里 ret + 2 是因为循环统计的是中间的变化次数,需要补上首尾两个端点。

LeetCode 334. 递增的三元子序列

题目要求判断数组中是否存在三个数呈递增关系。这其实是一个典型的贪心应用:我们不需要找到具体的哪三个数,只需要维护两个变量 a 和 b,分别代表找到的最小值和次小值。只要遍历过程中发现比 b 大的数,就说明存在三元组。

文章配图

关键在于每次更新时都要尽量让 a 和 b 变小,这样更容易遇到符合条件的第三个数。

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        int a = nums[0];
        int b = INT_MAX;
        int sz = nums.size();
        
        for (int i = 1; i < sz; ++i) {
            if (nums[i] > b) return true;
            if (a > nums[i]) a = nums[i];
            else if (nums[i] != a) b = nums[i];
            else continue;
        }
        return false;
    }
};

LeetCode 674. 最长连续递增序列

这道题相对简单,要求找到最长的连续递增子数组。只需从头到尾遍历一次,记录当前连续长度和最大长度即可。

文章配图

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        int ret = 1;
        int ret1 = 1;
        int sz = nums.size();
        
        for (int i = 0; i < sz - 1; ++i) {
            if (nums[i + 1] > nums[i]) ret1++;
            else ret1 = 1;
            if (ret1 > ret) ret = ret1;
        }
        return ret;
    }
};

LeetCode 121. 买卖股票的最佳时机

这道题本质是求两数之差的最大值。贪心策略体现在不断更新历史最低价 l,用当前价格减去它来尝试获取最大利润。

文章配图

class Solution {
public:
    int maxProfit(vector<int>& p) {
        int sz = p.size();
        int ret = 0;
        int l = INT_MAX; // 记录买入价
        
        for (int i = 0; i < sz; ++i) {
            if (l < p[i]) ret = max(ret, p[i] - l);
            if (l > p[i]) l = p[i];
        }
        return ret;
    }
};

这里的贪心之处在于 l 一直在动态更新,确保我们始终基于当前的最低成本来计算收益。

目录

  1. LeetCode 376. 摆动序列
  2. LeetCode 334. 递增的三元子序列
  3. LeetCode 674. 最长连续递增序列
  4. LeetCode 121. 买卖股票的最佳时机

更多推荐文章

查看全部
  • C++ 红黑树模拟实现
  • Webots 导入 STL 模型及尺寸颜色调整指南
  • 具身导航 VLN 前沿论文汇总(2023-2026)
  • 前端三年复盘:从迷茫摸索到互联网工程实战
  • 无模型自适应控制算法原理及与 PID 对比验证
  • Spring Boot 微服务架构设计与实战
  • 2026 年 3 月大模型全景解析:国产登顶与 Agent 工业化落地
  • Flutter 三方库 Arcade 在鸿蒙端的适配与实战
  • OpenClaw 部署全流程:本地安装、云端托管与进阶配置
  • 字节跳动音视频前端一面面经与性能优化深度解析
  • Vitis AI 模型 FPGA 边缘部署实战指南
  • Copilot Profiler Agent 辅助分析代码性能瓶颈
  • 理解大语言模型原理的 10 篇核心论文
  • Ubuntu 部署 OpenClaw 实战指南
  • MySQL 性能优化实战:索引、查询与架构建议
  • OpenClaw 30+ 真实使用案例开源,参考 AI 助理落地方案
  • OpenClaw 集成飞书机器人部署指南
  • N46Whisper:基于 Whisper 的日语语音转字幕工具
  • Qwen3-VL-WEBUI 事件定位:精确时间戳部署教程
  • Ollama:本地大模型 WebAPI 调用实战指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online