代码随想录算法训练营第二十七天| 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 }

 

posted @ 2023-07-08 09:56  博二爷  阅读(3)  评论(0编辑  收藏  举报