当前位置: 首页 > news >正文

代码随想录训练营Day33(贪心算法):Leetcode1005、134、135(难得有一天能完全独立做出题目)

Leetcode1005:

题目描述:

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

  • 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。

重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。

代码及注释:

class Solution {
public:int largestSumAfterKNegations(vector<int>& nums, int k) {//使用优先队列存储值最小的K个元素priority_queue<pair<int, int>>p;for (int i = 0; i < nums.size(); i++) {//存储值最小,因为默认是大根堆,所以存储负值p.push(pair<int, int>(-nums[i], i));}//对值最小的值取反//1.如果存在负数,优先取反最小的负数,可以使得和变大//2.不存在负数,但有0值,取反0值可以让数组值和不变//3.只存在非负整数,取反最小的值,可以使得代价最小//执行k次while (!p.empty() && k--) {pair<int, int>pp = p.top();p.pop();//如果只有0和正整数,可以对0取反k次,因此可以直接跳出循环if (nums[pp.second] == 0)break;else nums[pp.second] = -nums[pp.second];pp.first = -pp.first;//完成取反,得到新的值,重新加入p.push(pp);}int sum = 0;for (int i = 0; i < nums.size(); i++) {sum += nums[i];}return sum;}
};

Leetcode134:

题目描述:

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

代码及注释:

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int n = gas.size();//处理后的gas代表,gas[i]从第i个加油站到达第(i+1)个加油站所增加/减少的油for (int i = 0; i < n; i++) {gas[i] -= cost[i];}//由于起点唯一,因此如果存在等于0可以做起点,那只可能是只有一个元素if (n == 1 && gas[0] >= 0)return 0;//对每个加油站都尝试作为起点for (int i = 0; i < n;) {//作为起点的加油站必须能到达下一个加油站,本来就是没有油//gas[i]为负数,就不可能可以让i作为起点//大于0才能作为起点if (gas[i] > 0) {//记录到达加油站i+1还剩多少油int sum = gas[i];int begin = i;//>=0 才能说明可以到达 i+1while (sum >= 0) {//继续向后走i = (i + 1) % n;sum += gas[i];//直到又回到起点,完成搜索if (sum >= 0 && i == begin)return begin;}//剪枝if (i > begin && i < n)continue;i = begin + 1;}else {i++;}}return -1;}
};

Leetcode135:

题目描述:

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

  • 每个孩子至少分配到 1 个糖果。
  • 相邻两个孩子评分更高的孩子会获得更多的糖果。

请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

代码及注释:

class Solution {
public:int candy(vector<int>& ratings) {int n = ratings.size();int* ans = new int[n];//第一个孩子先给一个糖果ans[0] = 1;//边走边发糖果for (int i = 1; i < n; i++) {//如果当前孩子评分>前一个孩子if (ratings[i] > ratings[i - 1]) {//比前一个孩子多发一个糖果即可ans[i] = ans[i - 1] + 1;}//如果<=前一个孩子评分else {//给一个糖果就行ans[i] = 1;int j = i - 1;//前一个孩子也是只有一个糖果&&前一个孩子评分>当前孩子评分if (ans[j] == 1 && ratings[j] > ratings[i]) {//i-1孩子多发一个糖果ans[j] += 1;j--;//往前走,回溯while (j >= 0 && ratings[j] > ratings[j + 1] && ans[j] <= ans[j + 1])ans[j] = ans[j + 1] + 1, j--;}}}int sum = 0;for (int i = 0; i < n; i++) {sum += ans[i];}return sum;}
};

http://www.lryc.cn/news/343274.html

相关文章:

  • Flutter笔记:Widgets Easier组件库(12)使用消息吐丝(Notify Toasts)
  • 从《春色寄情人》学习如何面对死亡
  • 使用moveit控制机械臂
  • Mysql报错红温集锦(一)(ipynb配置、pymysql登录、密码带@、to_sql如何加速、触发器SIGNAL阻止插入数据)
  • ASP.NET Core SignalR 配置与集成测试究极指南
  • JENKINS 安装,学习运维从这里开始
  • 大语言模型从Scaling Laws到MoE
  • 四级英语翻译随堂笔记
  • Nacos支持的配置格式及其在微服务架构中的应用
  • 2024年华为OD机试真题-小明找位置-(C++)-OD统一考试(C卷D卷)
  • 机器人系统ros2内部接口介绍
  • 跟随Facebook的足迹:社交媒体背后的探索之旅
  • 面试题分享之Java并发篇
  • bpmn-js 多实例配置MultiInstanceLoopCharacteristics实现或签会签
  • 【gpedit.msc】组策略编辑器的安装,针对windows家庭版,没有此功能
  • 带EXCEL附件邮件发送相关代码
  • 【算法作业】均分卡牌,购买股票
  • python作业
  • 【Linux的文件篇章 - 管道文件】
  • C# 局部静态函数,封闭方法中的最佳选择
  • 【MySQL】MySQL 8.4.0 长期支持版(LTS)安装
  • nest中的ORM
  • TCP(Transmission Control Protocol,传输控制协议)如何保证数据的完整性?
  • Numpy库介绍
  • 临时有事无法及时签字盖章?试试用契约锁设置“代理人”
  • 数据库权限管理
  • 如何创建一个 Django 应用并连接到数据库
  • 【算法刷题day44】Leetcode:518. 零钱兑换 II、377. 组合总和 Ⅳ
  • 『51单片机』AT24C02[IIC总线]
  • Jenkins与Rancher的配合使用