欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > day28-贪心 __122.买卖股票的最佳时机II__55. 跳跃游戏__45.跳跃游戏II__1005.K次取反后最大化的数组和

day28-贪心 __122.买卖股票的最佳时机II__55. 跳跃游戏__45.跳跃游戏II__1005.K次取反后最大化的数组和

2025/4/18 20:14:44 来源:https://blog.csdn.net/2301_76865569/article/details/147062727  浏览:    关键词:day28-贪心 __122.买卖股票的最佳时机II__55. 跳跃游戏__45.跳跃游戏II__1005.K次取反后最大化的数组和

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

这道题的贪心策略相当的巧妙,比如对于任意的两天i,j(i<j)。如果我们按照天数范围来考虑的话,我们的利润是prices[j] - prices[i]。那这个时候,我们可以换一种想法,把i-j的利润,用每天利润的累加和来考虑,可以写成

(prices[j] - prices[j-1]) + (prices[j-1] - prices[j-2]) + … + (prices[i+1] - prices[i])。这样的话我们能够看出每天的利润可能是正的,也可能是负的。那么要考虑从i-j的最大利润是不是我们只需要考虑存在正利润的天数呢。显然是合理的。

所以我们只需要根据prices[],推出每天的利润,然后选择正利润加入即可。

代码如下:

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

55. 跳跃游戏

这道题问我们能否跳到最终的位置,每次的nums[i] 就是站在i下标下,我们能够跳跃的最大距离,所以如果我们在下标为i的位置,我们能够跳跃的范围就是(i,nums[i] + i),如果我们想要从i这一步到达终点的话,我们只需要判断nums[i] + i是否大于等于nums[i] + i。

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

45.跳跃游戏II

还是用上一题的思路,有一个关键概念是覆盖范围,我们每一次都要找到覆盖范围中最大的下一次覆盖范围,这样的话能保证,我们每一次跳跃都能保证下一次能跳的更远,这样多个下一次最远的叠加就能够使我们跳跃到终点。

语言不太好解释,大家可以参考视频贪心算法,最少跳几步还得看覆盖范围 | LeetCode: 45.跳跃游戏II

代码如下:

class Solution {
public:int jump(vector<int>& nums) {if(nums.size()<=1) return 0;int curDis = 0;int ans = 0;int nxtDis = 0;for(int i=0;i<nums.size();i++){nxtDis = max(nums[i]+i,nxtDis);if(i == curDis){ans++;curDis = nxtDis;if(curDis >= nums.size()-1) break;}}return ans;}
};

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

这道题相对前几道题来说,要简单很多,对于一个数字,如果他是负数,我们把其变成对应的正数,这样我们的数组总和就会增加。所以,我们只需要把尽可能的,把数组中较小的负数先一个一个转化为正数。如果负数转化完了,k还大于0。这个时候,我们需要去判断k是否为偶数,如果为偶数,我们可以随便选一个数,让其转换k次,还是其本身(代码中可以跳过),直接计算和就行了。如果为奇数,我们就要选择一个绝对值最小的数字,让其变为负数,再计算和。

这道题虽然逻辑简单,但是如果我们写的话,很容易将代码写的很冗余。这里我们显然要对nums进行排序,这个时候,如果我们直接按照递增或者递减来进行排序,后续的操作都会很麻烦。不过如果我们按照绝对值大小排序,这样我们后面处理就会很方便

代码如下:

class Solution {
public:static bool cmp(int a,int b){return abs(a) > abs(b);}int largestSumAfterKNegations(vector<int>& nums, int k) {int ans = 0;sort(nums.begin(),nums.end(),cmp);for(int i=0;i<nums.size();i++){if(nums[i] < 0 && k>0){nums[i] = 0 - nums[i];k--; // 复数全部改为正数}            }if(k % 2 == 1) nums[nums.size()-1] = 0 - nums[nums.size() - 1];for(int a : nums){ans += a;}return ans;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词