122.买卖股票的最佳时机II
局部最优:收集每天的正利润
全局最优:求得最大利润。
class Solution {
public int maxProfit(int[] prices) {
int result = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i] - prices[i-1] > 0) {
result += prices[i] - prices[i-1];
}
}
return result;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
55. 跳跃游戏
贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围)
整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
class Solution {
public boolean canJump(int[] nums) {
int end = nums[0];
for (int i = 0; i <= end; i++) { // 注意这个等于号,要一直遍历到end这个数组点
end = end > i + nums[i] ? end : i + nums[i];
if (end >= nums.length - 1) {
return true;
}
}
return false;
}
}
时间复杂度: O(n)
空间复杂度: O(1)
45. 跳跃游戏ii
局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。
整体最优:一步尽可能多走,从而达到最小步数。
- 处理基础情况,只有一个元素。
- 遍历当前数组,如果到curr的end或者终止位置,跳到激活nextend的点(当前范围内最大)或终点,增加步数,激活next的end。
class Solution {
public int jump(int[] nums) {
if (nums.length == 1) return 0;
int end = nums[0];
int nextEnd = nums[0];
int count = 0;
for (int i = 0 ; i < nums.length; i++) {
nextEnd = nextEnd > i + nums[i] ? nextEnd : i+nums[i];
if (i == end || i == nums.length -1) {
count++;
end = nextEnd;
}
}
return count;
}
}
如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。
class Solution {
public int jump(int[] nums) {
if (nums.length==1) return 0;
// implicit BFS
int step = 0;
int curr = 0, next = 0;
for (int i = 0; i < nums.length; i++) {
next = Math.max(next, nums[i]+i);
if (next >= nums.length-1) {
step ++;
break;
}
if (i == curr) {
step++;
curr = next;
}
}
return step;
}
}
时间复杂度: O(n)
空间复杂度: O(1)