122.买卖股票的最佳时机II
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. 跳跃游戏
bool canJump(vector<int>& nums) {
int range = 0;
for (int i = 0; i < nums.size(); i++) {
if (range >= i) {
range = max(range, i+nums[i]);
}
else return false;
}
return true;
}
这道题的思路是根据数组中的每个元素确定的覆盖范围来进行判断。遍历每个元素时,如果之前的范围可以覆盖到当前元素,则更新覆盖范围为原来和从这个元素中的最大值,然后继续遍历。如果最终遍历到了末尾元素仍在范围内,就返回true,如果途中就有不在范围内的元素的话就返回false。
45.跳跃游戏II
int jump(vector<int>& nums) {
if (nums.size() == 1) return 0;
int curDistance = 0; // 当前覆盖最远距离下标
int ans = 0; // 记录走的最大步数
int nextDistance = 0; // 下一步覆盖最远距离下标
for (int i = 0; i < nums.size(); i++) {
nextDistance = max(nums[i] + i, nextDistance); // 更新下一步覆盖最远距离下标
if (i == curDistance) { // 遇到当前覆盖最远距离下标
ans++; // 需要走下一步
curDistance = nextDistance; // 更新当前覆盖最远距离下标(相当于加油了)
if (nextDistance >= nums.size() - 1) break; // 当前覆盖最远距到达集合终点,不用做ans++操作了,直接结束
}
}
return ans;
}
这道题与上道题相比,多了求最小的步数,也可采用与上道题类似的思路,通过最大范围来解决问题。但这道题要有两个范围,一个当前范围,一个下一步的范围。每遍历一个元素时就要根据当前元素能取到的范围来更新nextDistance。当遍历到当前范围而还没有到最后一个元素时,就要将步数加一然后更新当前范围,变为遍历过后能达到的最新的最远范围,直至到最后一个元素为止。