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

Day29- 贪心算法part03

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

题目一:1005. K 次取反后最大化的数组和

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

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

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

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

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

问题的关键在于优先反转数组中的负数,因为这样可以增加数组的总和。

如果数组中的负数少于 K,剩余的操作应该用于反转最小的正数(如果有的话),并且要注意,如果剩余操作次数是偶数,最终结果不会改变;如果是奇数,则最终结果会减少两倍的最小元素的值。

/** @lc app=leetcode.cn id=1005 lang=cpp** [1005] K 次取反后最大化的数组和*/// @lc code=start
class Solution {
public:int largestSumAfterKNegations(vector<int>& nums, int k) {std::sort(nums.begin(), nums.end());for (int i = 0; i < nums.size() && k > 0; ++i) {if (nums[i] < 0) {nums[i] = -nums[i];--k;}}if (k % 2 == 1) {std::sort(nums.begin(), nums.end());nums[0] = -nums[0];}int sum = 0;for (int num : nums) {sum += num;}return sum;}
};
// @lc code=end

二、加油站

题目一:134. 加油站 

134. 加油站

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

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

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

如果一个车从加油站 A 出发,无法到达加油站 B,那么 A 和 B 之间的任何一个加油站都不能作为起始点到达加油站 B。

/** @lc app=leetcode.cn id=134 lang=cpp** [134] 加油站*/// @lc code=start
class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int totalTank = 0, currTank = 0, startingStation = 0;for (int i = 0; i < gas.size(); ++i) {totalTank += gas[i] - cost[i];currTank += gas[i] - cost[i];if (currTank < 0) {startingStation = i + 1;currTank = 0;}}return totalTank >= 0 ? startingStation : -1;}
};
// @lc code=end

三、分发糖果

题目一:135. 分发糖果 

135. 分发糖果

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

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

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

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

首先,需要给每个孩子至少一颗糖果。

然后,首先从左向右遍历,确保每个孩子如果比他左边的孩子评分高,则获得更多的糖果;其次,从右向左遍历,确保每个孩子如果比他右边的孩子评分高,则也获得更多的糖果

/** @lc app=leetcode.cn id=135 lang=cpp** [135] 分发糖果*/// @lc code=start
class Solution {
public:int candy(vector<int>& ratings) {int size = ratings.size();if (size < 2) {return size;}vector<int> candies(size, 1);  for (int i = 1; i < size; ++i) {if (ratings[i] > ratings[i - 1]) {candies[i] = candies[i - 1] + 1;}}for (int i = size - 2; i >= 0; --i) {if (ratings[i] > ratings[i + 1]) {candies[i] = std::max(candies[i], candies[i + 1] + 1);}}return accumulate(candies.begin(), candies.end(), 0);}
};
// @lc code=end

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

相关文章:

  • RPA与ChatGPT的融合:智能化流程的未来
  • Ubuntu安装maven并且配置阿里源
  • 如何通过idea使用JDK8.0创建Spring项目
  • Spark读取kafka(流式和批数据)
  • 经典目标检测YOLO系列(二)YOLOV2的复现(1)总体网络架构及前向推理过程
  • 怎样使用崭新的硬盘
  • Kafka-多线程消费及分区设置
  • 计算机导论06-人机交互
  • hot100:07接雨水
  • Docker安装MySQL教程分享(附MySQL基础入门教程)
  • 麒麟V10挂载iso,配置yum源
  • 《Linux C编程实战》笔记:信号的捕捉和处理
  • python算法与数据结构---单调栈与实践
  • 文心一言使用分享
  • 【C++干货铺】C++11新特性——lambda表达式 | 包装器
  • 在 EggJS 中实现 Redis 上锁
  • Unity-场景
  • MATLAB R2023b for Mac 中文
  • 01 MyBatisPlus快速入门
  • HarmonyOS 应用开发入门
  • 【机器学习300问】9、梯度下降是用来干嘛的?
  • 第13章 1 进程和线程
  • 什么是中间件?
  • 汽车售后服务客户满意度调查报告
  • 初始RabbitMQ(入门篇)
  • JVM:Java类加载机制
  • 要经历痛苦,才能在赚钱路上觉醒!
  • LeetCode 第381场周赛个人题解
  • 数据结构之二叉树的性质与存储结构
  • 机器视觉检测设备在连接器外观缺陷检测中的应用