代码随想录算法训练营第三十二天| ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II
买卖股票的最佳时机II
题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)
思路:本题的贪心法在于用不选择亏钱的买卖,某天能赚钱就一定出手,每天都赚钱从而获得总体的最大利益。具体是计算每一天的利润后,如果大于0,就记入总利益。
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<int> profit(prices.size()-1);
for(int i=1;i<prices.size();i++){
profit[i-1]=prices[i]-prices[i-1];
}
int count=0;
for(int j=0;j<profit.size();j++){
if(profit[j]>0)count+=profit[j];
}
return count;
}
};
显然这里存在一个更优化的写法
class Solution {
public:
int maxProfit(vector<int>& prices) {
int profit = 0;
for (int i = 1; i < prices.size(); i++) {
int tmp = prices[i] - prices[i - 1];
if (tmp > 0) profit += tmp;
}
return profit;
}
};
作者:Krahets
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/solutions/12625/best-time-to-buy-and-sell-stock-ii-zhuan-hua-fa-ji/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
跳跃游戏
思路:k表示可以最远可以到达的距离 ,当遍历到的点已经超出最远能到达的点,说明不能到达终点,如果一直跳到最终点,证明能走通。
我最开始的想法是每一个只跳一步,遇到0时开始检查前面的点,如果长度能跳过0,则能继续遍历,否则退出遍历返回false,但这个问题在于终点0和中途的0是不同的,中途的0必须跨过去,但是终点的0只需要跳到上面即可,因此不是很好想。
class Solution {
public:
bool canJump(vector<int>& nums) {
int k = 0;
for (int i = 0; i < nums.size(); i++) {
if (i > k) return false;
k = max(k, i + nums[i]);
}
return true;
}
};
作者:Ikaruga
链接:https://leetcode.cn/problems/jump-game/solutions/24322/55-by-ikaruga/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
跳跃游戏II
题目链接:45. 跳跃游戏 II - 力扣(LeetCode)
思路:首先count记录走的步数,k表示增加一步到达的最远范围,end表示不增加步数的情况下能达到的最大范围。
这里为什么for循环判断条件是nums.size()-1而不是nums.size()呢,原因在于:
况且规定本题的测试用例一定是可以达到终点的。
class Solution {
public:
int jump(vector<int>& nums) {
int count=0;
int k=0;
int end=0;
for(int i=0;i<nums.size()-1;i++){
k=max(k,i+nums[i]);
if(i==end){
end=k;
count+=1;
}
}
return count;
}
};
浙公网安备 33010602011771号