LeetCode热题100之贪心算法

1.买卖股票的最佳时机

在这里插入图片描述
思路分析:即需要找出某一天的最低价格和它后面几天的最高价格差。

  • 维护一个变量min_price,表示到目前为止遇到的最低股票价格;
  • 遍历prices数组,在每一天的价格上:
    • 更新min_price为当前的价格和min_price中的较小值;
    • 计算当天价格减去min_price的利润,即当天卖出的最大可能利润;
    • 将这个利润与之前记录的max_profit做比较,保留较大的利润
  • 最终得到的max_profit就是最大利润

具体实现代码(详解版):

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int min_price = INT_MAX; // 初始化为一个很大的数
        int max_profit = 0; // 初始最大利润为0

        for (int price : prices) {
            // 更新最小价格
            min_price = min(min_price, price);
            // 计算当前价格与最小价格的差值,并更新最大利润
            max_profit = max(max_profit, price - min_price);
        }

        return max_profit;
    }
};
  • 时间复杂度为O(n).

2.跳跃游戏

在这里插入图片描述
思路分析:贪心法适用于这种问题,因为我们每一步只需要关注从当前的最远位置能否再往前推进。只要每次都记录并更新最远位置,就能知道是否能够到达最后一个位置。

  • 定义最远可达位置:在遍历数组时,记录当前可以到达的最远位置。定义一个变量 farthest 来表示从起点到当前位置可以到达的最远下标。;
  • 遍历数组
    • 如果在遍历到某个位置 i 时,发现 farthest 小于 i,说明从起点出发无法到达位置 i,因此直接返回 false。
    • 从第一个位置开始遍历,每次更新 farthest 为当前位置 i 加上 nums[i],即 farthest = max(farthest, i + nums[i])。
  • 判断是否能到达最后一个位置
    • 在遍历结束后,如果 farthest 已经超过或等于最后一个下标,说明可以到达最后一个位置,返回 true。
    • 否则返回 false。

具体实现代码(详解版):

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n = nums.size();
        int farthest = 0;//可以跳跃到的最远位置
        for(int i = 0 ; i < n ; i ++){
            if(farthest < i){//从起点无法到达i
                return false;
            }
            farthest = max(farthest,i + nums[i]);//更新farthest
        }
        return farthest >= n - 1 ? true : false; //最后的判断 
    }
};
  • 时间复杂度:O(n);
  • 空间复杂度:O(n)

3.跳跃游戏II

在这里插入图片描述
思路分析:这是一个最小跳跃次数的问题,可以使用贪心算法来解决

  • 定义变量
    • 用min_jump记录总的跳跃数;
    • 用current_end记录当前跳跃的边界,即在这一条内能跳到的最远位置
    • 用farthest记录可以到达的最远位置
  • 遍历数组
    • 遍历数组,逐步更新farthest表示当前位置能到达的最远位置;
    • 当遍历到边界current_end时,说明必须进行一次跳跃来继续前进,此时min_jump增1,并更新current_end为farthest
  • 结束条件:如果currnt_end已经到达或超过数组末尾,说明可以到达终点,返回min_jump即可。

具体实现代码(详解版)

class Solution {
public:
    int jump(vector<int>& nums) {
        int min_jump = 0;// 记录跳跃次数
        int farthest = 0;// 当前跳跃的边界
        int current_end = 0;// 在当前跳跃中能够到达的最远位置
        int n = nums.size();

        if(n <= 1) return 0;//如果数组长度为或更小,不需要跳跃

        for(int i = 0 ; i < n ; i ++){
            farthest = max(farthest,i + nums[i]);//更新最远位置

            //到达当前跳跃的边界,必须进行一次跳跃
            if(i == current_end){
                min_jump ++;//次数加1
                current_end = farthest;//更新跳跃边界为最远位置
                
                // 如果已经可以到达或超过最后一个位置,直接返回跳跃次数
                if(farthest >= n -1) break;
            }
        }
        return min_jump;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

4.划分字母区间

在这里插入图片描述
思路分析:这个问题要求将字符串 s 划分为尽可能多的片段,并确保每个片段内的字符不会重复出现。我们可以通过 贪心算法 来实现这个需求

  • 记录每个字符的最后出现位置:首先,我们需要确定每个字符在字符串中最后出现的位置。因为一旦一个字符在某个位置被包含在某个片段中,我们就可以保证该字符在这个片段的范围内,后续再出现该字符时就不能被包含到当前片段中,而必须开始新的片段。
    • 我们遍历字符串 s,利用一个哈希表 lastIndex 记录每个字符在字符串中的最后位置。这样可以随时查询到某个字符的最后出现位置。

为什么记录最后出现位置:
例如,在字符串 “abac” 中,字符 ‘a’ 在索引 0 和索引 3 出现,我们需要知道 ‘a’ 在索引 3 处最后一次出现,这样我们就可以在第 0 到第 3 索引之间创建一个片段,确保 ‘a’ 被包含在这个片段内。

  • 确定片段的范围:在遍历字符串时,我们使用一个变量 end 来记录当前片段的结束位置。这个结束位置会随着我们遇到字符并更新字符的最后出现位置而动态变化。
    • 当遍历到一个字符 s[i] 时,我们查找该字符的 最后出现位置,并更新 end 为 max(end, lastIndex[s[i]]),确保 end 记录了当前片段的最远边界。
    • 如果当前的索引 i 达到了 end,说明当前片段已经完成,因为所有在这个片段内的字符的最后出现位置都已经在片段内了。
  • 划分片段并记录片段长度:当我们确定一个片段已经结束时,我们就记录该片段的长度,并且将 start 更新为下一个片段的起始位置。这样就能不断划分新的片段。
    • 当 i == end 时,说明当前片段已经完全确定,片段的长度是 end - start + 1;
    • 记录片段长度后,将 start 更新为 i + 1,开始下一个片段的划分。

具体实现代码(详解版);

class Solution {
public:
    vector<int> partitionLabels(string s) {
        vector<int> result;  // 用来保存最终的片段长度
        unordered_map<char, int> lastIndex;  // 用于记录每个字符最后出现的位置

        // Step 1: 记录每个字符的最后出现位置
        for (int i = 0; i < s.size(); i++) {
            lastIndex[s[i]] = i;
        }

        int start = 0, end = 0;  // start记录当前片段的起始位置,end记录当前片段的结束位置
        // Step 2: 遍历字符串确定片段
        for (int i = 0; i < s.size(); i++) {
            end = max(end, lastIndex[s[i]]);  // 更新当前片段的结束位置
            if (i == end) {  // 当前片段结束
                result.push_back(end - start + 1);  // 记录当前片段的长度
                start = i + 1;  // 更新下一个片段的起始位置
            }
        }

        return result;  // 返回所有片段的长度
    }
};
  • 时间复杂度:O(1)
  • 空间复杂度:O(1).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/911990.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SL6115降压恒流 60V降压恒流芯片,高精度1%,PWM模拟调光

一、核心参数与性能 工作电压范围&#xff1a;5.5V至60V&#xff0c;宽输入电压范围使其能够适应多种应用场景。 最大输出电流&#xff1a;根据公开发布的信息&#xff0c;SL6115的最大输出电流可达到1.2A至1.5A&#xff0c;具体取决于不同版本或制造商的规格说明。这一高输出…

测试概念以及测试bug

关于测试的概念 什么是需求&#xff1f; 需求分为用户需求和软件需求。 软件需求可以作为开发和测试工作的依据&#xff0c;而用户需求不一定是合理的&#xff0c;这里的不合理有很多的角度&#xff1a;技术角度上&#xff0c;市场需求上&#xff0c;投入成本和收益比噔噔。…

【青牛科技】GC5931:工业风扇驱动芯片的卓越替代者

在工业领域&#xff0c;工业风扇的稳定高效运行对于维持良好的生产环境至关重要。而驱动芯片作为工业风扇控制系统的核心元件&#xff0c;其性能直接影响风扇的工作状态。芯麦 GC5931 作为一款新型驱动芯片&#xff0c;在替代 A5931/Allegro 应用于工业风扇中展现出了非凡的优势…

阿里云docker安装禅道记录

docker network ls docker network create -d bridge cl_network sudo docker run --name zentao --restart always -p 9982:80 --networkcl_network -v /data/zentao:/data -e MYSQL_INTERNALtrue -d hub.zentao.net/app/zentao:18.5 升级禅道 推荐用按照此文档升级&a…

艾体宝产品丨加速开发!Redis Copilot智能助手上线

我们最近发布了 Redis Copilot&#xff0c;旨在帮助开发者更加高效地使用 Redis 构建应用。提升应用性能&#xff0c;简化构建过程是我们不懈的追求。Redis Copilot 正是为此而生的人工智能助手&#xff0c;助力开发者迅速掌握 Redis 的使用技巧。现在您可以在 Redis Insight 中…

深度学习入门:梯度消失问题浅谈(Sigmod,ReLu)

Sigmoid的梯度消失 以下是一个通过简单的神经网络示例来解释 Sigmoid 函数的梯度消失问题。 假设有一个非常简单的三层神经网络&#xff0c;输入层有两个神经元&#xff0c;隐藏层有两个神经元&#xff0c;输出层有一个神经元。我们使用均方误差作为损失函数&#xff0c;并且…

Chromium127编译指南 Linux篇 - 额外环境配置(五)

引言 在成功获取 Chromium 源代码后&#xff0c;接下来我们需要配置适当的编译环境&#xff0c;以便顺利完成开发工作。本文将详细介绍如何设置 Python 和相关的开发工具&#xff0c;以确保编译过程无碍进行。这些配置步骤是开发 Chromium 的必要准备&#xff0c;确保环境设置…

批量混剪矩阵发布助力短视频营销快速获客

内容概要 在现代营销环境中&#xff0c;短视频已经成为品牌传播的重要工具&#xff0c;尤其是在获取潜在客户方面&#xff0c;短视频营销展现出了卓越的效率。那么&#xff0c;为什么要做短视频营销呢&#xff1f;首先&#xff0c;短视频能够迅速抓住观众的注意力&#xff0c;…

uni-app小程序echarts中tooltip被遮盖

图表中的文案过长&#xff0c;tooltip溢出容器&#xff0c;会被遮盖住 解决方案&#xff1a; 在echarts的tooltip中有confine属性可将tooltip限制在容器内&#xff0c;不超过容器&#xff0c;就不易被遮盖

怎么把图片快速压缩变小?图片在线压缩的3款简单工具

随着互联网的快速发展&#xff0c;将图片上传到网上平台来展示是很常用的一种方式&#xff0c;但是现在图片质量越来越高&#xff0c;导致图片也比较大&#xff0c;经常会出现无法上传的情况。那么在遇到这个问题时&#xff0c;通过图片压缩功能来处理图片会比较简单。本文给大…

科学计算服务器:如何计算算力?如何提升科学研究效率?

在现代科学研究的舞台上&#xff0c;科学计算服务器犹如一位强大的幕后英雄&#xff0c;为复杂科学计算任务的攻克提供着坚实支撑。准确计算其算力并充分发挥优势&#xff0c;对提升科学研究效率意义非凡。 服务器的中央处理器&#xff08;CPU&#xff09;计算力。在科学计算服…

【MRAN】情感分析中情态缺失问题的多模态重构和对齐网络

abstract 多模态情感分析&#xff08;MSA&#xff09;旨在通过文本、视觉和声音线索识别情感类别。然而&#xff0c;在现实生活中&#xff0c;由于各种原因&#xff0c;可能会缺少一到两种模式。当文本情态缺失时&#xff0c;由于文本情态比视觉和听觉情态包含更多的语义信息&…

Kafka生产者如何提高吞吐量?

1、batch.size&#xff1a;批次大小&#xff0c;默认16k 2、linger.ms&#xff1a;等待时间&#xff0c;修改为5-100ms 3、compression.type&#xff1a;压缩snappy 4、 RecordAccumulator&#xff1a;缓冲区大小&#xff0c;修改为64m 测试代码&#xff1a; package com.bigd…

【论文笔记】SparseRadNet: Sparse Perception Neural Network on Subsampled Radar Data

原文链接&#xff1a;https://arxiv.org/abs/2406.10600 简介&#xff1a;本文引入自适应子采样方法和定制网络&#xff0c;利用稀疏性模式发掘雷达信号中的全局和局部依赖性。本文的子采样模块选择 RD谱中在下游任务贡献最大 像素 的子集。为提高子采样数据的特征提取&#xf…

如何制定公司软件测试策略

在当今快速发展的软件行业&#xff0c;制定一套有效的软件测试策略至关重要。尤其是在互联网产品的背景下&#xff0c;测试策略不仅需要高效&#xff0c;还要具备灵活性&#xff0c;以便快速响应市场变化。本文将对比传统测试策略与互联网产品测试策略&#xff0c;并提供制定公…

【JWT】Asp.Net Core中JWT刷新Token解决方案

Asp.Net Core中JWT刷新Token解决方案 前言方案一:当我们操作某个需要token作为请求头的接口时,返回的数据错误error.response.status === 401,说明我们的token已经过期了。方案二:实现用户无感知的刷新token值,我们希望当响应返回的数据是401身份过期时,响应阻拦器自动帮我…

机器学习—Softmax

Softmax回归算法是Logistic回归的推广&#xff0c;它是一种针对多类分类上下文的二进制分类算法。 当y可以接受两个可能的输出值时&#xff0c;Logistic回归就适用了&#xff0c;不是零就是一&#xff0c;它计算这个输出的方式是首先计算zw*xb&#xff0c;然后计算ag(z)&#…

docker镜像文件导出导入

1. 导出容器&#xff08;包含内部服务&#xff09;为镜像文件&#xff08;docker commit方法&#xff09; 原理&#xff1a;docker commit命令允许你将一个容器的当前状态保存为一个新的镜像。这个新镜像将包含容器内所有的文件系统更改&#xff0c;包括安装的软件、配置文件等…

【韩老师零基础30天学会Java 】02笔记

sublime Text中本身没有GBK编码&#xff0c;需要安装 要在sublime Text中设置编码为GBK&#xff0c;请按照以下步骤操作 打开Sublime Text编辑器,点击菜单栏中的“Preferences”(首选项)选项&#xff0c;找打Package Control选项。点击Package Control&#xff0c;随后搜索Inst…

如何设置 TORCH_CUDA_ARCH_LIST 环境变量以优化 PyTorch 性能

引言 在深度学习领域&#xff0c;PyTorch 是一个广泛使用的框架&#xff0c;它允许开发者高效地构建和训练模型。为了充分利用你的 GPU 硬件&#xff0c;正确设置 TORCH_CUDA_ARCH_LIST 环境变量至关重要。这个变量告诉 PyTorch 在构建过程中应该针对哪些 CUDA 架构版本进行优…