力扣hot100 -- 贪心算法

👂 ▶ 逍遥叹 - 胡歌&沈以城【Mashup】 (163.com)

👂 庐州月 - 许嵩 - 单曲 - 网易云音乐

2.7 小时,加上写博客,4 道题,😂 -- 希望二刷时,可以 3 小时,8 道题....

目录

🍉买卖股票的最佳时机

🌼跳跃游戏

[🍓跳跃游戏 II](#🍓跳跃游戏 II)

🎂划分字母区间


🍉买卖股票的最佳时机

121. 买卖股票的最佳时机 - 力扣(LeetCode)

贪心:维护目前为止的最小值

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int minPrice = 1e4; // 维护一个最小值
        int ans = 0;
        for (auto x : prices) {
            minPrice = min(minPrice, x);
            ans = max(ans, x - minPrice);
        }
        ans = ans < 0 ? 0 : ans;
        return ans;
    }
};

🌼跳跃游戏

55. 跳跃游戏 - 力扣(LeetCode)

贪心:维护可以跳到的最大索引(下标)

cpp 复制代码
class Solution {
public:
    bool canJump(vector<int>& nums) {
        int Max = 0; // 维护当前可以跳到的最远下标
        for (int i = 0; i < nums.size(); ++i) {
            // 当前索引 i > Max, 说明无法到达
            if (i > Max)
                return false;
            if (Max >= nums.size() - 1)
                break;
            Max = max(Max, i + nums[i]);
        }
        return true;
    }
};

// 1 2 5 1 1 0 3 1 0  1 1 1

🍓跳跃游戏 II

45. 跳跃游戏 II - 力扣(LeetCode)

题目保证 "可以到达 numsn - 1"

每次跳跃前,先计算最大范围,然后依次计算这个范围内

各个坐标所能到达的最远的点 maxPos,作为本次跳跃的目的地 end....

cpp 复制代码
class Solution {
public:
    int jump(vector<int>& nums) {
        int maxPos = 0; // 维护最远的点
        int ans = 0, end = 0;

        // 不是 < nums.size(), 最后一个元素不用继续跳了
        for (int i = 0; i < nums.size() - 1; ++i) { 
            // 最大范围 [i, end]
            maxPos = max(maxPos, i + nums[i]); // 维护最远距离
            if (i == end) { // 这一跳结束
                end = maxPos;
                ans++; // 只有到达 end, 才更新步数
            }
        }
        return ans;
    }
};

// 1 1
// 1

🎂划分字母区间

763. 划分字母区间 - 力扣(LeetCode)

第一次遍历 O(n),用一个数组 last26 维护每个字母最后出现的位置
当前子串范围 start, end

第 2 次遍历 O(n),逐个遍历 i

动态地用 lasts\[i - 'a'] 更新 end,直到 i == end,满足当前子串要求

cpp 复制代码
class Solution {
public:
    vector<int> partitionLabels(string s) {
        vector<int> ans;
        int last[26];

        for (int i = 0; i < s.size(); ++i)
            last[s[i] - 'a'] = i; // 字母 s[i] 最后出现位置

        int start = 0, end = 0; // 当前划分范围
        for (int i = 0; i < s.size(); ++i) {
            end = max(end, last[s[i] - 'a']); // 更新最后出现位置
            if (i == end) {
                ans.push_back(end - start + 1);
                start = end + 1;
            }
        }
        return ans;
    }
};
相关推荐
LB21128 分钟前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP1 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN1 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218312 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤2 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate3 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran3 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹3 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统
疯狂打码的少年4 小时前
【数据库技术】多值依赖与第四范式(4NF)
数据库·笔记·算法
子文雨4 小时前
基于 uC3845 与 ATtiny13 双芯片架构的 8.4V/2.5Ah 锂电池智能充电器设计
单片机·嵌入式硬件·算法