122.买卖股票的最佳时机II
题目链接:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
求解思路:
- 分解为每天的利润
- 只收集正利润
代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int sum = 0;
for (int i = 1; i < prices.size(); i++){
// 分解成每天的利润
// 贪心:只取正的利润
int temp = prices[i] - prices[i-1];
if (temp > 0)
sum += temp;
}
return sum;
}
};
55. 跳跃游戏
题目链接:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
求解思路:
- 遍历所有点,如果当前点比前面所有点可以达到的点的最大距离还要大就返回false
- 如果能遍历到最后一个点,说明最后一个点可以到达,返回true
代码:
class Solution {
public:
bool canJump(vector<int>& nums) {
int k = 0;
for (int i = 0; i < nums.size(); i++){
// 说明当前nums[i]无法再前进
if (i > k) return false;
// k为当前nums[i]能到的最远距离
k = max(k, i + nums[i]);
}
return true;
}
};
45.跳跃游戏II
题目链接:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
求解思路:
- 每一步都有一个可跳范围最大值end
- 遍历某一步的可跳范围时,使用maxPos收集下一步能跳到的最远距离
- 当遍历到end时,说明到达了这一步的起跳范围的结束点,此时需要再跳一步,即ans++,并且需要更新可跳范围最大值end
- 注意控制移动下标 i 只移动到 nums.size() - 2 的位置(最后一步一定是可以到的终点,题目假设总是可以到达数组的最后一个位置)
代码:
class Solution {
public:
int jump(vector<int>& nums) {
// ans:最终最少需要几步;end:当前起跳范围的结束点;maxPos:下一次能跳到的最远距离
int ans = 0, end = 0, maxPos = 0;
// 注意这里是nums.size()-1
for (int i = 0; i < nums.size()-1; i++){
// 遍历过程中取能跳到的范围的最大值
maxPos = max(maxPos, i + nums[i]);
// 此时到达了当前起跳范围的结束点,必须再跳一步
if (i == end){
end = maxPos;
ans++;
}
}
return ans;
}
};