代码随想录算法训练营 | 贪心算法 part02

ops/2024/10/22 17:19:15/

122. 买卖股票的最佳时机 II

122. 买卖股票的最佳时机 II
在这里插入图片描述
局部最优:在价格趋势呈上涨的两端买入和卖出,保证利润为正值;比如:Day2买入,Day3卖出;
全局最优:计算所有局部最优的和,求得最大利润

class Solution {
public:int maxProfit(vector<int>& prices) {int res = 0;for (int i = 0; i < prices.size() - 1; i++) {int diff = prices[i + 1] - prices[i];if (diff > 0) {res += diff;}}return res;}
};

55. 跳跃游戏
55. 跳跃游戏

inums[i]i+nums[i]mx最远能到达的位置备注
0222
1334可以到达最后一个位置
2134
3144
4488
inums[i]i+nums[i]mx最远能到达的位置备注
0333
1233
2133
3033最远可以到达此位置
44--不能跳到此位置

局部最优:最远能跳到的位置,
全局最优:最后更新的最远可以跳到的位置是否可以到达数组的最后一个下标

class Solution {
public:bool canJump(vector<int>& nums) {int mx = 0; // 最远能跳到的位置// if (nums.size() == 1) {//     // 数组只有一个元素,即我们跳跃的起点,肯定可以到到达//     return true;// }for (int i = 0; i <= mx; ++i) { // 在最远位置范围内的可以继续跳跃mx = max(mx, i + nums[i]); // 更新最远可以到达的位置if (mx >= nums.size() - 1) { // 最远位置可以覆盖数组最后一个下标return true;}}return false;}
};

45. 跳跃游戏II
45. 跳跃游戏II

inums[i]i+nums[i]maxPos最远能到达的位置备注
0222
1233第一步跳跃可覆盖的范围,可以在此处进行第二步跳跃
2355第二步跳跃可以达到的最远的位置;同时可以到达最后一个位置,共跳跃2步,0->2->5
3145
4155
5088

在这里插入图片描述

局部最优:以 最小步数 增加最远能跳到的位置;每跳跃一步,在前一步跳跃覆盖的范围内寻找下一个可以跳到更远位置的下标,作为该步跳跃的起始位置;
例如:nums = [2,2,3,1,1,0]; 起始位置nums[0] = 2; 可以跳到下标为1, 和下标为2的两个位置;从这两个位置中选取可以跳的更远的一个下标作为新的其实位置;i = 1maxPos = max(2, 1 + nums[1]) =3i = 2maxPos = max(2, 2 + nums[2]) =5 ;所以下标2 作为新的起跳位置。

全局最优:到达数组最后一个下标位置的最小跳跃次数

class Solution {
public:int jump(vector<int>& nums) {int maxPos = 0;int end = 0;int steps = 0;if (nums.size() == 1) {return 0;}for (int i = 0; i < nums.size() - 1; ++i) {maxPos = max(maxPos, i + nums[i]);if (i == end) { // 遇到边界,更新边界,并且步数加 1end = maxPos;steps++;}}return steps;}
};

1005 K 次取反后最大化的数组和
1005 K 次取反后最大化的数组和
局部最优:较大的正数越多和越大,优先将绝对值大的负数取反;如果负数全部取反后,K次还大于0,将最小的非负数反复取反;
全局最优:数组和达到最大

class Solution {
public:static bool cmp(int a, int b) {return abs(a) > abs(b);}int largestSumAfterKNegations(vector<int>& nums, int k) {sort(nums.begin(), nums.end(), cmp); // 按绝对值由大到小排序for (int i = 0; i < nums.size(); i++) { // 将尽可能多的绝对值大的负数取反if (nums[i] < 0 && k > 0) {nums[i] *= -1;k--;}}// 如果k还大于0,数组已全为非负数,那么反复取反数值最小的元素,将K用完if (k % 2 == 1) nums[nums.size() - 1] *= -1; int sum = 0;for (int nums : nums) { // 求和sum += nums; }return sum;}
};

http://www.ppmy.cn/ops/93079.html

相关文章

Vortex GPGPU的硬件代码分析(Cache篇4)

文章目录 前言一、bank access&#xff1f;二、作者归纳的VX_cache和VX_bank特点——指导VX_bank的设计细节2.1 VX_cache特点2.2 VX_bank特点2.3 一点疑惑 三、整理点debug或者test的预备知识总结 前言 前面已经分析了Vortex GPGPU的架构&#xff1a;Vortex GPGPU的硬件设计和…

npm vs pnpm 之幽灵依赖

在之前的文章&#x1f4c4; 果断放弃npm切换到pnpm–节约磁盘空间&#xff08;256G硬盘救星&#xff09; 中有提及 npm 扁平化带来的幽灵&#x1f47b;依赖 问题&#xff0c;但没有特别展开&#xff0c;这段时间实际业务中遇到了该问题&#xff0c;特整理如下&#xff1a; ♨️…

【项目实战】C++视频共享点播系统

目录 一、项目介绍 1.1 对视频共享点播系统的认识 1.2服务端程序负责功能 1.3 服务端功能模块划分 1.4 项目界面演示 1.5预备知识 二.环境搭建 2.1 安装 Jsoncpp 库 2.1.1 使用jsoncpp 2.2 引入httplib库 2.2.1 安装Git&#xff08;如果你的系统尚未安装Git&#xf…

【C#】StringComparer

什么是“文化” 在 .NET 中&#xff0c;“文化”&#xff08;Culture&#xff09;指的是与语言、地区、和区域设置相关的特定信息集合。这些信息包括了日期和时间的格式、数字的表示方式、货币符号、字符串比较规则等等。文化的概念在软件开发中特别重要&#xff0c;因为应用程…

10步搞定Python爬虫从零到精通!

学习Python网络爬虫可以分为以下几个步骤&#xff0c;每一步都包括必要的细节和示例代码&#xff0c;以帮助你从零开始掌握这一技能。 第一步&#xff1a;理解网络爬虫基础 什么是网络爬虫&#xff1f; 网络爬虫是一种自动化程序,用来从互联网上收集数据.它通过发送 HTTP 请求…

【Python_PySide6学习笔记(三十七)】清空QLayout中所有控件的方法

清空QLayout中所有控件的方法 清空QLayout中所有控件的方法前言正文1、takeAt()方法2、自定义f_clearLayoutFunc()方法3、setParent(None)方法 清空QLayout中所有控件的方法 前言 在 GUI 开发中&#xff0c;当我们使用 PySide6&#xff08;或兼容的PyQt6&#xff09;的 QVBox…

Vue-04.指令-v-if和v-show

v-if v-else v-else-if 条件性的渲染某元素&#xff0c;判定为true时渲染&#xff0c;否则不渲染 v-show 根据条件展示某元素&#xff0c;区别在于切换的是display属性的值 v-if在浏览器中element标签中如果不满足条件就不会渲染展示…

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task01 DeepSeek简易AI助手

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向 Task01 正处于拿毕业证求职和实习离职期间的过渡期&#xff0c;想着闲着也是闲着&#xff0c;索性拉上本科同学队友报名参加AI比赛&#xff0c;想方设法卷个项目经验出来。 Task1的任务主要是体验从0开始搭建一个AI对…