代码随想录第三十三天
122.买卖股票的最佳时机II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
在进行AC的时候,思考方式主要借鉴了最大和子序列,将相邻之间的差值求解出来,然后只取正数部分。
代码如下:
//买卖股票的时机
int timeToSell(vector<int>& nums)
{
vector<int> value;
for (int i=1;i<nums.size();i++)
{
value.push_back(nums[i] - nums[i - 1]);
}
int sum = 0;
for (int i=0;i<value.size();i++)
{
if (value[i] > 0)
{
sum += value[i];
}
}
return sum;;
}
55. 跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
通过当前的可到达的最远距离确定为下一阶段的搜索范围,从而搜索在这一区间内是否有符合条件的元素,若有则返回,,否则继续向前搜寻。
代码如下:
bool jumpGame(vector<int>& nums)
{
int cover = 0;
for (int i=0;i<=cover;i++)
{
cover = max(i + nums[i], cover);
if (cover >= nums.size())
return true;
}
return false;
}
45.跳跃游戏II
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
确定每次跳到下一步能跳到的最远位置的元素处,从而得到最少次数。
代码如下:
int jumpMinTime(vector<int>& nums)
{
int k = 0;
int curlDistanc = 0;
int nextDistanc = 0;
for (int i=0;i<nums.size();i++)
{
nextDistanc = max(nextDistanc, nums[i] + i);
if (i == curlDistanc)
{
if (curlDistanc != nums.size() - 1)
{
k++;
curlDistanc = nextDistanc;
if(nextDistanc>=nums.size()-1)
break;
}
else
break;
}
}
return k;
}