当前位置: 首页 > 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

相关文章:

  • 系统架构13 - 软件工程(1)
  • 第二章 使用 SQL Search
  • 使用docker配置semantic slam
  • Python ddddocr 构建 exe 程序后运行报错:Failed Load model ... common_old.onnx
  • Mac M1 Parallels CentOS7.9 Deploy Typecho
  • 考研C语言刷编程题篇之分支循环结构基础篇(一)
  • 从零开始c++精讲:第三篇——内存管理
  • 计算机毕业设计选题分享-ssm租房小程序42196(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等
  • esp32-c-简单应用笔记
  • python-基础篇-函数
  • 「实战应用」如何用DHTMLX Gantt构建类似JIRA式的项目路线图(二)
  • 软件测试|使用matplotlib绘制箱型图
  • SpringSecurity(07)——JWT整合
  • react和vue的区别
  • 数字身份所有权:Web3时代用户数据的掌控权
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Angular 2 DI - IoC DI - 1
  • C++11: atomic 头文件
  • golang中接口赋值与方法集
  • isset在php5.6-和php7.0+的一些差异
  • java中的hashCode
  • node 版本过低
  • Python - 闭包Closure
  • Redis 中的布隆过滤器
  • Service Worker
  • tweak 支持第三方库
  • 工作中总结前端开发流程--vue项目
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 浏览器缓存机制分析
  • 漂亮刷新控件-iOS
  • 前端代码风格自动化系列(二)之Commitlint
  • 深度学习入门:10门免费线上课程推荐
  • 收藏好这篇,别再只说“数据劫持”了
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微服务框架lagom
  • 温故知新之javascript面向对象
  • 源码安装memcached和php memcache扩展
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 我们雇佣了一只大猴子...
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #Z0458. 树的中心2
  • (2)nginx 安装、启停
  • (zhuan) 一些RL的文献(及笔记)
  • (二)斐波那契Fabonacci函数
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (三)终结任务
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (转)EOS中账户、钱包和密钥的关系
  • .NET 4.0中的泛型协变和反变
  • .Net Core 中间件验签
  • .NET 的程序集加载上下文
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET/C# 的字符串暂存池