代码随想录算法训练营第二十七天| 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II
122.买卖股票的最佳时机II
注意:
1,第一个和最后一个
2,只有一个数的情况
3,2255,这种情况
思路:
1,买入:左:空/高/平 右:高
2,卖出:左:低 右:空/ 低/平
代码:
1 int maxProfit(vector<int>& prices) { 2 int result = 0; 3 if (prices.size() <= 1) return result; 4 pair<int, int> inOut; 5 for (int i = 0; i < prices.size(); i++) 6 { 7 if (i == 0 && prices[i] < prices[i + 1]) 8 { 9 inOut.first = prices[i]; 10 } 11 else if (i == prices.size() - 1 && prices[i - 1] < prices[i]) 12 { 13 inOut.second = prices[i]; 14 result += inOut.second - inOut.first; 15 } 16 else if (i > 0 && i < prices.size() - 1 && prices[i] < prices[i + 1] && prices[i] <= prices[i - 1]) 17 { 18 inOut.first = prices[i]; 19 } 20 else if (i > 0 && i<prices.size() - 1 && prices[i] >= prices[i + 1] && prices[i] > prices[i - 1]) 21 { 22 inOut.second = prices[i]; 23 result += inOut.second - inOut.first; 24 } 25 } 26 27 return result; 28 }
55. 跳跃游戏
思路:
在当前节点可跳范围内,如果能找到有个节点它的可跳范围超过了当前节点的范围,就选择它
终止条件:
它的可调范围超过了最后一个节点
或者 没有一个节点可以超过当前节点的可调范围
代码:
1 bool canJump(vector<int>& nums) { 2 if (nums.size() <=1) return true; 3 4 int i = 0; 5 while (i < nums.size()) 6 { 7 int cur_max = i + nums[i]; 8 if (cur_max >= nums.size() - 1) return true; 9 for (int j = i; j <= cur_max; j++) 10 { 11 if (nums[j] + j > cur_max) 12 { 13 i = j; 14 break; 15 } 16 } 17 18 if (cur_max == i + nums[i]) 19 return false; 20 } 21 22 return false; 23 }
45.跳跃游戏II
思路:
找到最大的可调范围,然后result+1
代码:
1 int jump(vector<int>& nums) { 2 int result = 0; 3 if (nums.size() <= 1) return 0; 4 5 int i = 0; 6 while (i < nums.size()) 7 { 8 int cover = nums[i] + i; 9 if (cover >= nums.size() - 1) return ++result; 10 11 int max_cover = cover; 12 for (int j = i; j <= cover; j++) 13 { 14 if (max_cover < nums[j] + j) 15 { 16 max_cover = nums[j] + j; 17 i = j; 18 } 19 20 } 21 22 result++; 23 } 24 25 return result; 26 }