【Day24 LeetCode】贪心Ⅱ

server/2025/1/23 16:20:08/

一、贪心Ⅱ

1、leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/" rel="nofollow">买卖股票的最佳时机 II 122

这题第一想法是使用动态规划做,每天有两个状态,持有股票和非持有股票,每次计算这两个状态下的最优值。

class Solution {
public:int maxProfit(vector<int>& prices) {//表示当前 没有/有股票的两个状态int dp0 = 0, dp1 = -prices[0]; for(int i=1; i<prices.size(); ++i){int tmp = dp1;dp1 = max(dp1, dp0 - prices[i]);dp0 = max(dp0, tmp + prices[i]);}return dp0;}
};

贪心的做法就是 只要当前股票值会在明天上升,则在当前进行购买,在明天进行售卖获取利润。因为要求只能持有一只股票,即使price[i]到price[j]之间股票一直在涨,亦可将利润划分成 p r i c e [ j ] − p r i c e [ i ] = ( p r i c e [ j ] − p r i c e [ j − 1 ] ) + ( p r i c e [ j − 1 ] − p r i c e [ j − 2 ] ) + . . . + ( p r i c e [ i + 1 ] − p r i c e [ i ] ) price[j] - price[i] = (price[j]-price[j-1]) +(price[j-1]-price[j-2])+...+(price[i+1]-price[i]) price[j]price[i]=(price[j]price[j1])+(price[j1]price[j2])+...+(price[i+1]price[i]),所以每天的正利润构成了最后的总利润。

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

这题采用动态规划的思路更容易想到一点。

2、leetcode.cn/problems/jump-game/description/" rel="nofollow">跳跃游戏 55

思路:找到最大的跳跃范围,看能不能跳到终点。每次取当前点能跳的最远点作为跳跃范围,在这个合法的范围内不断更新最大范围。

class Solution {
public:bool canJump(vector<int>& nums) {int end = 0, n = nums.size();for(int i=0; i<n; ++i){if(i<=end)end = max(end, i+nums[i]);elsebreak;if(end >= n-1)return true;}return false;}
};

3、leetcode.cn/problems/jump-game-ii/description/" rel="nofollow">跳跃游戏Ⅱ 45

这题在上一题跳跃游戏的基础上需要找到最小跳跃次数,思路是:在当前这跳的范围内选择一个作为起点,可达终点最远。当遍历到当前这跳的边界,可是视为已经完成一跳,直到当前这跳范围已达最终终点。

class Solution {
public:int jump(vector<int>& nums) {// curEnd记录当前这一跳的范围终点,nxtEnd记录下一跳的最大范围终点int curEnd = 0, nxtEnd = 0; int n = nums.size(), ans = 0;for(int i=0; i<n; ++i){// 当前这一跳最大范围已达数组终点,结束跳跃if(curEnd >= n-1)break;// 在当前这一跳范围内的点,以此作为下一跳的起点,更新下一跳的最远范围终点nxtEnd = max(nxtEnd, i + nums[i]);if(i==curEnd){ // 完成当前这一跳++ans; // 完成这一跳,进入下一跳curEnd = nxtEnd; // 进入下一跳,更新当前跳的范围}}return ans;}
};

4、leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/" rel="nofollow">K次取反后最大化的数组和 1005

思路:先将数组从小到大排序,遇到负数且有次数就反转该负数,这样越小的负数反转得到的值越大。最后判断是否有次数剩余,如果剩余奇数次,则需要再进行一次反转,对哪个数进行反转最有利呢?有次数剩余的情况下一定会是数组内已经没有负数了,所以当然对最小值进行反转最有利

class Solution {
public:int largestSumAfterKNegations(vector<int>& nums, int k) {int n = nums.size();sort(nums.begin(), nums.end());  // 从小到大排序int i = 0;while(i<n && k>0){if(nums[i] < 0){ // 遇到负数反转nums[i] *= -1;--k;}++i;}int s = 0, MIN = INT_MAX;for(int num : nums){// 计算 数组和s += num;// 有k剩余 则需要找到数组的最小值if(k % 2)MIN = min(MIN, num);}// 有k剩余,则对数组和s减去2倍的数组最小值// 因为是要反转这个最小值,而s已经加过没反转的最小值,所以是2倍s += (MIN < INT_MAX ? -2 * MIN : 0); return s;}
};

二、写在后面

修改了后面两题代码,添加了更多注释。


http://www.ppmy.cn/server/160785.html

相关文章

学习golang语言时遇到的难点语法

作者是java选手&#xff0c;实习需要转go&#xff0c;记录学习go中遇到的一些与java不同的语法。 defer defer特性 1. 关键字 defer 用于注册延迟调用。 2. 这些调用直到 return 前才被执。因此&#xff0c;可以用来做资源清理。 3. 多个defer语句&#xff0c;按先进…

知识蒸馏:大模型智慧的传承与精炼

知识蒸馏 在学校DeepSeek的技术文章,对于其中的“基于 Qwen 和 Llama 从 DeepSeek-R1 中提炼出的六个稠密模型(1.5B、7B、 8B、14B、32B、70B参数规模)”,有点困惑所以详细的学习和研究了一下。 知识蒸馏是什么 知识蒸馏是一种将知识从一个较大、较复杂的教师模型转移到一…

2024年博客之星主题创作|2024年度感想与新技术Redis学习

Redis工具深入了解 1.引言与感想2.Redis工具了解2.分布式系统了解2.1单机架构2.2分布式是什么2.3应用服务和数据库服务分离2.4引入更多的应用服务器2.5理解负载均衡器2.6数据库读写分离2.7引入缓存2.8数据库分库分表2.9引入微服务2.10分布式系统小结 1.引言与感想 2024学习了很…

如何使用 some() 方法检查数组中是否有元素满足条件?

数组遍历相关问题&#xff1a;如何使用 some() 方法检查数组中是否有元素满足条件&#xff1f; 在 JavaScript 中&#xff0c;数组是我们常常需要操作的数据结构。some() 方法是数组的一个常用遍历方法&#xff0c;用于检查数组中是否有至少一个元素满足指定的条件。它通过回调…

209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 C class Solution { public:int min…

WPF 复杂页面布局及漂亮 UI 界面设计全解析

在 WPF 开发领域&#xff0c;打造一个既具备复杂功能又拥有美观 UI 界面的应用程序是众多开发者追求的目标。复杂页面布局与漂亮的 UI 设计不仅能提升用户体验&#xff0c;还能展现应用的专业性和独特性。本文将深入探讨如何在 WPF 中实现复杂页面布局以及设计出令人眼前一亮的…

STL--list(双向链表)

目录 一、list 对象创建 1、默认构造函数 2、初始化列表 3、迭代器 4、全0初始化 5、全值初始化 6、拷贝构造函数 二、list 赋值操作 1、赋值 2、assign&#xff08;迭代器1&#xff0c;迭代器2&#xff09; 3、assign&#xff08;初始化列表&#xff09; 4、assig…

SQL表间关联查询详解

简介 本文主要讲解SQL语句中常用的表间关联查询方式&#xff0c;包括&#xff1a;左连接&#xff08;left join&#xff09;、右连接&#xff08;right join&#xff09;、全连接&#xff08;full join&#xff09;、内连接&#xff08;inner join&#xff09;、交叉连接&…