【数据结构与算法】LeetCode: 贪心算法

news2024/11/6 19:09:40

文章目录

  • LeetCode: 贪心算法
    • 买卖股票的最佳时机 (Hot100)
    • 买卖股票的最佳时机 II
    • 跳跃游戏 (Hot100)
    • 跳跃游戏 II(Hot100)
    • 划分字母区间 (Hot100)
    • 分发饼干
    • K次取反后最大化的数组和
    • 合并区间
    • 用最少数量的箭引爆气球
    • 无重叠区间

LeetCode: 贪心算法

买卖股票的最佳时机 (Hot100)

买卖股票的最佳时机

买卖只有一次

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int max_profit = 0;
        int min_price = INT_MAX ;
        for(int price : prices){  // ,右边的最大值-左边的最小值为最优值
            max_profit = max(max_profit, price- min_price); 
            min_price = min(min_price,price);
        }

        return max_profit;
    }
};

买卖股票的最佳时机 II

买卖股票的最佳时机 II

买卖可以有多次

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int result = 0;
        for(int i = 1; i < prices.size(); i++)
            result += max(prices[i] - prices[i-1], 0); // 把每天的正收益加起来
        return result;
    }
};

跳跃游戏 (Hot100)

跳跃游戏
能否到达最后一个下标

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int max_pos  = 0 + nums[0]; // i之前的最远可达位置

        for(int i = 1; i < nums.size(); i++){   // 枚举每个位置
            if (i > max_pos) return false;      // i不可达
            max_pos = max(max_pos, i + nums[i]);
        }
        return true;
    }
};

跳跃游戏 II(Hot100)

跳跃游戏 II
到达最后一个下标的最小跳跃次数

class Solution {
public:
    int jump(vector<int> &nums) {
        int ans = 0;    // 跳跃次数
        int start = 0;  // 当前跳跃可达区间左边界
        int end = 0;    // 当前跳跃可达空间右边界

        while (end < nums.size() - 1) {
            int max_pos = 0;    // 能跳到的最远距离
            for (int i = start; i <= end; i++) {
                // 当前可达区间能跳到的最远距离
                max_pos = max(max_pos, i + nums[i]);
            }
            ans++;            // 跳跃
            start = end + 1;  // 更新左边界
            end = max_pos;    // 更新右边界
         
        }
        return ans;
    }
};

划分字母区间 (Hot100)

划分字母区间

统计每一个字符最后出现的位置。
从头遍历字符,并更新已遍历字符的最远出现下标,如果找到最远出现位置下标和当前下标相等了,则找到了分割点

class Solution {
public:
    vector<int> partitionLabels(string S) {
        int hash[26] = {0}; // i为字符,hash[i]为字符出现的最后位置
        for (int i = 0; i < S.size(); i++) { // 统计每一个字符最后出现的位置
            hash[S[i] - 'a'] = i;
        }
 
        vector<int> result;
        int left = 0; // 遍历最左下标
        int right = 0;// 已遍历字符最大出现位置
        // 从头遍历字符
        for (int i = 0; i < S.size(); i++) {
            right = max(right, hash[S[i] - 'a']); // 更新已遍历(i之前)字符最大出现位置
            // 如果找到已遍历字符最远出现位置下标和当前下标相等了,则找到了分割点
            if (i == right) { 
                result.push_back(right - left + 1);
                left = i + 1;
            }
        }
        return result;
    }
};

分发饼干

分发饼干

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int index = s.size() - 1;                 // 饼干数量
        int result = 0;                           // 喂饱的小孩数量
        for (int i = g.size() - 1; i >= 0; i--) { // 遍历小孩
            if (index >= 0 && s[index] >= g[i]) { // 还有饼干且饼干尺寸大于小孩胃口
                result++;
                index--;
            }
        }
        return result;
    }
};

K次取反后最大化的数组和

K次取反后最大化的数组和

class Solution { 
public:
    int largestSumAfterKNegations(vector<int>& nums, int K) {
    	// 按照绝对值从大到小排列
        sort(nums.begin(), nums.end(), [](int a, int b){return abs(a) > abs(b);}); 
        for(int i = 0; i < nums.size(); i++){
            if(nums[i] < 0 && K > 0){  // 把最小的负数变为正
                nums[i] *= -1;
                K--;
            }
        }
        // 如果K不为0且nums此时都为正数:负负得正抵消
        if(K % 2 == 1) nums[nums.size() - 1] *= -1; // 如果K为奇数
        int result = 0;
        for(int a : nums) result += a;
        return result;
    }
};

合并区间

合并区间

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> result;
        // 根据左边界从小到大排序
        sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});
        // 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并
        result.push_back(intervals[0]); 
        for (int i = 1; i < intervals.size(); i++) {
            if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间
                // 合并区间,只更新右边界就好,因为是按照左边界排序的
                result.back()[1] = max(result.back()[1], intervals[i][1]); 
            } else { // 区间不重叠 ,直接放入
                result.push_back(intervals[i]); 
            }
        }
        return result;
    }
};

用最少数量的箭引爆气球

用最少数量的箭引爆气球

class Solution {

public:
    int findMinArrowShots(vector<vector<int>>& points) {
        if (points.size() == 0) return 0;
        // 按照左边界从小到大排序
        sort(points.begin(), points.end(), [](vector<int>& a, vector<int>& b){return a[0] < b[0];});

        int result = 1; // points 不为空至少需要一支箭
        for (int i = 1; i < points.size(); i++) {
            if (points[i][0] > points[i - 1][1]) {  // 气球i和气球i-1不挨着
                result++; // 需要加一支箭
            }
            else {  // 气球i和气球i-1挨着
                points[i][1] = min(points[i - 1][1], points[i][1]); // 更新重叠气球最小右边界
            }
        }
        return result;
    }
};

无重叠区间

无重叠区间

class Solution {
public:

    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if (intervals.size() == 0) return 0;
        //  按照区间左边界从小到大排序
        sort(intervals.begin(), intervals.end(), [](vector<int>& a, vector<int>& b){return a[0] < b[0];});

        int result = 1; // 记录非重叠区间的个数
        // 从左到右,对于重叠的多个区间,优先去掉右边界较大的
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] >= intervals[i - 1][1]) { // 区间i不与左边右边界最小的区间重叠
                result++; // 非重叠区间数量+1
            }
            else {  // 区间i与左边的区间重叠
                intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]); // 更新重叠气球最小右边界
            }
        }
        return intervals.size() - result;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes——part8-2 k8s集群存储解决方案 GlusterFS

一、存储解决方案介绍 1.1 GlusterFS GlusterFS是一个开源的分布式文件系统具有强大的横向扩展能力通过扩展能够支持数PB存储容量和处理数千客户端GlusterFS借助TCP/IP或InfiniBandRDMA网络将物理分布的存储资源聚集在一起&#xff0c;使用单一全局命名空间来管理数据。 1.2…

Kafka 之顺序消息

前言&#xff1a; 在分布式消息系统中&#xff0c;消息的顺序性是一个重要的问题&#xff0c;也是一个常见的业务场景&#xff0c;那 Kafka 作为一个高性能的分布式消息中间件&#xff0c;又是如何实现顺序消息的呢&#xff1f;本篇我们将对 Kafka 的顺序消息展开讨论。 Kafk…

js WebAPI黑马笔记(万字速通)

此笔记来自于黑马程序员&#xff0c;pink老师yyds 复习&#xff1a; splice() 方法用于添加或删除数组中的元素。 注意&#xff1a; 这种方法会改变原始数组。 删除数组&#xff1a; splice(起始位置&#xff0c; 删除的个数) 比如&#xff1a;1 let arr [red, green, b…

C 学习(5)

哈哈哈哈哈&#xff0c;终于想起来了&#xff01;贴一下主要的参考&#xff1a; 基本语法 - 《阮一峰《C 语言教程》》 - 书栈网 BookStack 内容写的比较浅显有疏漏&#xff0c;如果看不明白&#xff0c;再结合一下百度。 注释 C 语言的注释有两种表示方法。 第一种方法是…

redis7学习笔记

文章目录 1. 简介1.1 功能介绍1.1.1 分布式缓存1.1.2 内存存储和持久化(RDBAOF)1.1.3 高可用架构搭配1.1.4 缓存穿透、击穿、雪崩1.1.5 分布式锁1.1.6 队列 1.2 数据类型StringListHashSetZSetGEOHyperLogLogBitmapBitfieldStream 2. 命令2.1 通用命令copydeldumpexistsexpire …

【设计模式系列】建造者模式(十)

目录 一、什么是建造者模式 二、建造者模式的角色 三、建造者模式的典型应用 四、建造者模式在StringBuilder中的应用 五、典型建造者模式的案例 一、什么是建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;用于构建复杂对…

用vite创建项目

一. vite vue2 1. 全局安装 create-vite npm install -g create-vite 2. 创建项目 进入你想要创建项目的文件夹下 打开 CMD 用 JavaScript create-vite my-vue2-project --template vue 若用 TypeScript 则 create-vite my-vue2-project --template vue-ts 这里的 …

JVM结构图

JVM&#xff08;Java虚拟机&#xff09;是Java编程语言的核心组件之一&#xff0c;负责将Java字节码翻译成机器码并执行。JVM由多个子系统组成&#xff0c;包括类加载子系统、运行时数据区、执行引擎、Java本地接口和本地方法库。 类加载子系统&#xff08;Class Loading Subsy…

WordPress伪静态设置

为什么要设置WordPress伪静态&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;中&#xff0c;静态URL通常被认为更易于搜索引擎爬虫抓取和索引&#xff0c;有助于提高网站的搜索引擎排名。 WordPress伪静态设置方法主要依赖于服务器环境&#xff0c;以下是针对不同服务器…

【黑盒测试】等价类划分法及实例

本文主要介绍黑盒测试之等价类划分法&#xff0c;如什么是等价类划分法&#xff0c;以及如何划分&#xff0c;设计等价类表。以及关于三角形案例的等价类划分法。 文章目录 一、什么是等价类划分法 二、划分等价类和列出等价类表 三、确定等价类的原则 四、建立等价类表 …

宠物领养救助管理软件有哪些功能 佳易王宠物领养救助管理系统使用操作教程

一、概述 佳易王宠物领养救助管理系统V16.0&#xff0c;集宠物信息登记、查询&#xff0c;宠物领养登记、查询&#xff0c; 宠物领养预约管理、货品进出库库存管理于一体的综合管理系统软件。 概述&#xff1a; 佳易王宠物领养救助管理系统V16.0&#xff0c;集宠物信息登记…

RK3568开发板静态IP地址配置

1. 连接SSH MYD-LR3568 开发板设置了静态 eth0:1 192.168.0.10 和 eth1:1 192.168.1.10&#xff0c;在没有串口时调试开发板&#xff0c;可以用工具 SSH 登陆到开发板。 首先需要用一根网线直连电脑和开发板&#xff0c;或者通过路由器连接到开发板&#xff0c;将电脑 IP 手动设…

Flutter错误: uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared

前言 今天要做蓝牙通信的功能&#xff0c;我使用了flutter_reactive_ble这个库&#xff0c;但是在运行的时候发现一下错误 Launching lib/main.dart on AQM AL10 in debug mode... /Users/macbook/Desktop/test/flutter/my_app/android/app/src/debug/AndroidManifest.xml Err…

【含开题报告+文档+源码】基于Java的房屋租赁服务系统设计与实现

开题报告 随着城市化进程的加速和人口流动性的增加&#xff0c;租房需求不断增长。传统的租赁方式往往存在信息不对称、流程不规范等问题&#xff0c;使得租户和房东的租赁体验不佳。而而房屋租赁系统能够提供便捷、高效的租赁服务&#xff0c;满足租户和房东的需求。房屋租赁…

斯托克斯矢量,表示电磁波的(不是散射体)平均后,可分解为完全极化电磁波和噪声

可见完全极化分就表示只有一种&#xff0c;在T矩阵中是只有一种散射体&#xff0c;在电磁波协方差矩阵中是只有一种电磁波

微服务day03

导入黑马商城项目 创建Mysql服务 由于已有相关项目则要关闭DockerComponent中的已开启的项目 [rootserver02 ~]# docker compose down WARN[0000] /root/docker-compose.yml: version is obsolete [] Running 4/4✔ Container nginx Removed …

大腾智能荣获盐田区黄金珠宝产业“产业赋能数字化优选能力伙伴”荣誉

11月2日&#xff0c;盐田区黄金珠宝产业数智化转型促进中心&#xff08;简称“促进中心”&#xff09;揭牌仪式圆满举办。盐田区委书记李忠&#xff0c;市工业和信息化局、市市场监督管理局、华为技术有限公司等相关单位、企业负责人共同见证促进中心揭牌启动。 大腾智能也出席…

10天进阶webpack---(2)webpack模块兼容性处理

回顾CMJ和ESM的区别 CMJ的本质可以使用一个函数概括 // require函数的伪代码 function require(path){if(该模块有缓存吗){return 缓存结果;}function _run(exports, require, module, __filename, __dirname){// 模块代码会放到这里}var module {exports: {}}_run.call(mod…

034_Structural_Transient_In_Matlab结构动力学问题求解

结构动态问题 问题描述 我们试着给前面已经做过的问题上加一点有趣的东西。 结构静力学求解 当时求解这个问题&#xff0c;在最外面的竖直切面加载了一个静态的固定的力。下面我们试试看在上方的表面增加一个脉冲压力载荷。 采用统一的有限元框架&#xff0c;定义问题&…

简单的 docker 部署ELK

简单的 docker 部署ELK 这是我的运维同事部署ELK的文档&#xff0c;我这里记录转载一下 服务规划 架构: Filebeat->kafka->logstash->ES kafka集群部署参照: kafka集群部署 部署服务程序路径/数据目录端口配置文件elasticsearch/data/elasticsearch9200/data/elas…