【每日多题之贪心】

2023-11-17

道阻且长,行则将至。

1、分割平衡字符串

1.1、题目描述

1221. 分割平衡字符串

    在一个 平衡字符串 中,'L' 'R' 字符的数量是相同的。给你一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。
注意:分割得到的每个字符串都必须是平衡字符串,且分割得到的平衡字符串是原平衡字符串的连续子串。
返回可以通过分割得到的平衡字符串的 最大数量
示例:
输入:s = “RLRRLLRLRL”
输出:4
解释:s 可以分割为 “RL”、“RRLL”、“RL”、“RL” ,每个子字符串中都包含相同数量的 ‘L’ 和 ‘R’ 。

1.2、题目分析

    (1)明确题目中说明的 s s s一定是平衡字符串
    (2)计数问题,遍历容器,遇到字符 L L L,和计数器加一,否则就减一,当和计数器为0的时候说明前面走过的字符串是一个平衡字符串,则答案计数器加一。

1.3、代码实现

class Solution {
public:
    int balancedStringSplit(string s) {
        int cnt = 0;
        int sum = 0;
        int i;
        for(i = 0; i < s.size(); ++i){
            sum += (s[i] == 'L' ? 1 : -1);
            if(sum == 0){
                ++cnt;
            }
        }
        
        return cnt;
    }
};

2、最少操作数使数组递增

2.1、题目描述

1827. 最少操作数使数组递增

给你一个整数数组 nums下标从 0 开始)。每一次操作中,你可以选择数组中一个元素,并将它增加 1
    比方说,如果nums = [1,2,3] ,你可以选择增加 nums[1] 得到
     nums = [1,3,3]
请你返回使 nums严格递增最少 操作次数。
我们称数组 nums是 严格递增的 ,当它满足对于所有的 0 <= i < nums.length - 1 都有 nums[i] < nums[i+1] 。一个长度为 1 的数组是严格递增的一种特殊情况。
示例:
输入:nums = [1,1,1]
输出:3
解释:你可以进行如下操作:
1)增加 nums[2] ,数组变为 [1,1,2] 。
2)增加 nums[1] ,数组变为 [1,2,2] 。
3)增加 nums[2] ,数组变为 [1,2,3] 。

2.2、题目分析

    (1)一般简单题进行模拟都可以做出来;
    (2)维护一个变量pre记录已经完成递增任务的元素,维护一个答案变量ans。从第二个数开始遍历数组,当nums[i]小于pre时,就要更新当前的nums[i]为使递增的最小数(pre+1) (这里的更新只是思想上更新,并不是真的进行更新),并记录变化量(pre+1) - nums[i],还要记得更新pre的值;当num[i大于pre的时候不需要进行操作,只要更新pre就好了。

2.3、代码实现

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

3、卡车上的最大单元数

3.1、题目描述

1710. 卡车上的最大单元数

请你将一些箱子装在 一辆卡车 上。给你一个二维数组 boxTypes
其中 boxTypes[i] = [numberOfBoxesi, numberOfUnitsPerBoxi]
    numberOfBoxesi 是类型 i 的箱子的数量。
    numberOfUnitsPerBoxi 是类型 i 每个箱子可以装载的单元数量。
整数 truckSize 表示卡车上可以装载 箱子最大数量 。只要箱子数量不超过 truckSize ,你就可以选择任意箱子装到卡车上。
返回卡车可以装载 单元最大 总数。
示例:
输入:boxTypes = [[1,3],[2,2],[3,1]], truckSize = 4
输出:8
解释:箱子的情况如下:
-1 个第一类的箱子,里面含 3 个单元。
-2 个第二类的箱子,每个里面含 2 个单元。
-3 个第三类的箱子,每个里面含 1 个单元。
可以选择第一类和第二类的所有箱子,以及第三类的一个箱子。
单元总数 = (1 * 3) + (2 * 2) + (1 * 1) = 8

3.2、题目分析

    (1)贪心的思想,每次都选取当前truckSize下包含最多单元的箱子;
    (2)首先对二维数组按照进行第二个元素进行排序,然后遍历二维数组,利用贪心思想解决。

3.3、代码实现

class Solution {
public:
    int maximumUnits(vector<vector<int>>& boxes, int truckSize) {
        sort(boxes.begin(), boxes.end(), [](const vector<int> v1, const vector<int> v2){
            return v1[1] > v2[1];
        });
        int ans = 0;
        int i, n = boxes.size();
        int currNum = 0;
        for(auto &box : boxes){
            if(box[0] <= truckSize){
                ans += box[0] * box[1];
                truckSize -= box[0];
            }
            else{
                ans += truckSize * box[1];
                break;
            }
        }
        
        return ans;
    }
};

3.4、总结

    (1)与其说是总结,不如说是对本题知识点的回顾吧;
    (2)贪心思想:选取当前最优解得到的结果就是全局最优解,本题中就是每次都选取当前truckSize下可以包含的最大单元的那个箱子;
    (3)排序操作,利用的是快排,时间复杂度是O(nlogn),并且是自定义排序,是sort()函数的一个重载版本,第三个参数是一个 谓词 ,利用的是 lambda表达式 来实现的;
    (4)谓词 是一个可调用的表达式,其返回结果是一个能被用做条件的值,具体用法可见《C++ Primer中文版(第五版)》约344页;
    (5)、lambda表达式 表示一个可调用的代码单元,其 捕获列表 可以为空但不能省略,参数列表 可以省略,函数体 不可以省略,具体用法可见《C++ Primer中文版(第五版)》约345页.

4、打折购买糖果的最小开销

4.1、题目描述

2144. 打折购买糖果的最小开销

一家商店正在打折销售糖果。每购买 两个 糖果,商店会 免费 送一个糖果。
免费送的糖果唯一的限制是:它的价格需要小于等于购买的两个糖果价格的 较小值
    比方说,总共有 4 个糖果,价格分别为 1234 ,一位顾客买了价格为 23 的糖果,那么他可以免费获得价格为 1 的糖果,但不能获得价格为 4 的糖果。
给你一个下标从 0 开始的整数数组 cost ,其中 cost[i] 表示第 i 个糖果的价格,请你返回获得 所有 糖果的 最小 总开销。
示例:
输入:cost = [1,2,3]
输出:5
解释:我们购买价格为 2 和 3 的糖果,然后免费获得价格为 1 的糖果。
总开销为 2 + 3 = 5 。这是开销最小的 唯一 方案。
注意,我们不能购买价格为 1 和 3 的糖果,并免费获得价格为 2 的糖果。
这是因为免费糖果的价格必须小于等于购买的 2 个糖果价格的较小值。

4.2、题目分析

    (1)为了减小开销,一定是要尽可能的获得更多 免费 的糖果,那么就是每买两颗,送一颗。

4.3、代码实现

class Solution {
public:
    int minimumCost(vector<int>& cost) {
        sort(cost.begin(), cost.end(), greater());
        int i, n = cost.size();
        int ans = 0;
        for(i = 0; i < n; ++i){
            ans += cost[i];
            if(i+1 < n){
                ans += cost[i+1];
            }
            else{
                break;
            }
            i += 2;
        }
        
        return ans;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【每日多题之贪心】 的相关文章

随机推荐

  • 架构 但服务多租户_华为以AI和混合云实现多租户数据中心架构转型

    华为采用全球直播的方式以 你好 智能世界 为主题举办行业数字化转型大会 把原计划在巴塞罗那现场举办的活动时间不变 2月24日 27日 搬到线上 针对互联网服务行业数字化 专门举办的MTDC 多租户数据中心论坛 于北京时间27日开启全球线上直
  • 外包干了2个月,技术退步明显...

    先说一下自己的情况 大专生 18年通过校招进入湖南某软件公司 干了接近4年的功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋友
  • 调用halcon函数时的错误处理

    注 以下材料来自halcon帮助文档 因水平有限 难免有误 欢迎指正 0 概述 在遇到一个运行时错误时 HALCON C 会以默认的方式给出错误信息 并终止程序 然而 在某些情况下 我们并不希望按照这样的规则来处理错误 例如 当一个程序允许
  • centos7.8从卸载python2,安装python3

    因为目前所有环境都是python2 7 5 但是项目上使用的是python3 7 5 迫切需要使用python3 7 5验证 安装遇到困难 记录一下 首先卸载python2 如果不想卸载python2的可以跳过 这里卸载python2和其依
  • 信息图:iOS 7开发者需要知道的事

    如果你想为iOS 设备开发app 你需要知道如何与软件交互 如何设计 你还要知道苹果独特的开发理念和开发工具 真正的能力还需要成功地从其他行业领域借鉴核心概念 最后把所有这些东西糅合进你的信息库中 所以我们画了一张iOS 7开发者应该的知识
  • iOS开发:使用大图+脚本,生成各种size的app icon和图片素材

    美术UI在公司是宝贵的资源 集各种项目宠爱于一身 为了努力完成好老板的进度需求 不给UI添麻烦 程序员开始忙活了 在iOS里面 我们使用image assert来管理素材和app icon 为什么呢 因为方便 按照image assert要
  • 怎样在前端遍历后端服务器传递来的json字符串中的集合?

    怎样在前端遍历后端服务器传递来的json字符串中的集合 后端把一个List类型的集合先转换成json字符串然后返回给通过ajax返回给前端 如下图 后端服务器中的代码如下图 紧着着前端页面遍历 后端传递来的json字符串中的集合数据 先来看
  • 读论文(二) - BERT

    Introduction 预训练的语言模型 在改进自然语言处理任务方面非常有效 包括句子级别的任务 自然语言推理和释义 也包括分词级别的任务 NER和问答 将预训练的语言表示应用于下游任务有两种现有策略 基于特征 feature based
  • 循环神经网络(RNN)的基本原理及LSTM的基本结构

    来源于课上实验 结果清晰 遂上传于此 实验环境TensorFlow1 14 该课件仅用于教学 请勿用于其他用途 详细参考 实验笔记 实验视频 一 实验目的 学习掌握循环神经网络 RNN 的基本原理及LSTM的基本结构 掌握利用LSTM神经元
  • vulfocus靶场安装教程

    背景 漏洞把场是目前每个安全人员以及想学习信息安全的人必备的东西 但目前商业化产品居多 还有一些类似dwwa sqlilabs这类的开源项目 但是漏洞环境比较固定 使用完一次后就失去其作用 搭建的成本过高 每次启动的流程会比较繁锁 甚至很多
  • 【react】对state的理解

    state是类创建的实例对象上的一个状态属性 想要改变类的实例对象的值 就要用到构造器 但由于类组件都是继承的React内置的Component类 继承的类 要写构造器的话 就必须写super 改变state this state xxx
  • TIP Spring-boot健康检查查看详细信息

    Spring boot提供了健康检查的手段 定期检查应用各个组件的状态 并提供了一些通用组件的检查 比如MySQL Redis等 可以使用下面的命令查看应用的健康状态 curl localhost port health 如果应用有异常 会
  • GhostNetV2学习笔记

    GhostNetV2学习笔记 GhostNetV2 Enhance Cheap Operation with Long Range Attention Abstract 轻量级卷积神经网络 CNNs 是专为在移动设备上具有较快推理速度的应用
  • Deployment Controller 典型使用场景

    1 重新调度 Rescheduling 不管想运行 1 个副本还是 1000 个副本 副本控制器都能确保指定数量的副本存在于集群中 即使发生节点故障或 Pod 副本被终止运行等意外状况 2 弹性伸缩 Scaling 手动或者通过自动扩容代理
  • 【科普】CRC校验(一)什么是CRC校验?

    目录 CRC 循环冗余校验 CRC 校验码的生成 CRC 的发送方与接收方 发送方 接收方 除法异或运算示意图 CRC 循环冗余校验 CRC Cyclic Redundancy Check 循环冗余检验 是一种用于检测数字数据错误的技术 作
  • 不用JS,教你只用纯HTML做出几个实用网页效果

    转载请注明出处 葡萄城官网 葡萄城为开发者提供专业的开发工具 解决方案和服务 赋能开发者 原文出处 https blog bitsrc io pure html widgets for your web application c90155
  • Python - 遍历列表

    方法1 for循环直接遍历 lists m1 1900 m2 2000 for item in lists print item 注 同JAVA中的foreach循环一样 用for循环遍历列表 并不能改变列表中的数据项的值 lists m1
  • 校验密码复杂度(规则:长度8-30,必须包含数字、字母、特殊符号)、校验用户名(规则:长度4-19,包含数字、字母,不包含特殊字符)

    校验密码复杂度 规则 长度8 30 必须包含数字 字母 特殊符号 校验用户名 规则 长度4 19 包含数字 字母 不包含特殊字符
  • RHEL8网络管理

    RHEL8网络管理服务 NetworkManager早期的设计目的是为了统一网络配置 表示以后所有的网络相关的配置都使用NetworkManager来实现 NetworkManager服务提供了3种工具用来配置网卡参数 都不需要去手动修改网
  • 【每日多题之贪心】

    文章目录 1 分割平衡字符串 1 1 题目描述 1 2 题目分析 1 3 代码实现 2 最少操作数使数组递增 2 1 题目描述 2 2 题目分析 2 3 代码实现 3 卡车上的最大单元数 3 1 题目描述 3 2 题目分析 3 3 代码实现