1.买卖股票的最佳时机 II
贪心的思路:只要前一个比后一个小就算利息,即便是连续上升也没有关系,因为每一次的差值都会在最后的累加中算进去。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int ret = 0;
for(int i=0;i<prices.size()-1;i++)
{
if(prices[i]<prices[i+1])
ret+=(prices[i+1]-prices[i]);
}
return ret;
}
};
2.跳跃游戏
关键把握元素为0的条件
情况一:一个数组,数量等于1时,只有有一个元素,那么不需要考虑,因为全覆盖了。
情况二:一个数组,只要没有零,那就不存在false的情况,因为怎么走都能走
情况三:一个数组,除去最后一个元素,其他之中有0元素,那么此时就需要考虑会不会出现false的问题,其实很简单,如果一个位置上的数为0,那么数的前面位置都无法到达该位置的后面,也就是说前面位置的所有元素都小于当前位置和前面对应元素位置的差。
class Solution {
public:
bool canJump(vector<int>& nums) {
if(nums.size()==1)
return true;
for(int i=nums.size()-2;i>=0;i--)
{
if(nums[i]==0)
{
if(i==0)
return false;
else
{
int falg=0;
for(int j=i-1;j>=0;j--)
{
if((i-j)<nums[j])
falg=1;
}
if(falg==0)
return false;
}
}
}
return true;
}
};
覆盖范围
cover是用于记录当前位置可走过的最大范围
每向前走一次都要计算一次当前位置能走过的最大范围,随后和cover比较,并且如果大于cover则更新cover,那么每次循环的条件就是i小于等于cover的条件。
class Solution {
public:
bool canJump(vector<int>& nums) {
if(nums.size()==1)
return true;
int cover = 0;
for(int i=0;i<=cover;i++)
{
cover=(cover>=i+nums[i])?cover:i+nums[i];
if(cover>=nums.size()-1)
return true;
}
return false;
}
};
3.跳跃游戏 II
每一层的cover表示上次位置下,最多能向前走的范围
max_cover表示当前的最大向前范围
循环中,需要每次更新max_cover。如果i==cover,此时就是最大能跨越的范围,我们定义ret为跨越的次数,由于每次都是经可能范围大的向前,说明现在的条件就是最适合向前跨越的一次的时间,ret++,并且更新cover的值为max_cover的值
class Solution {
public:
int jump(vector<int>& nums) {
if (nums.size() == 1)
return 0;
int cover = 0;
int max_cover = 0;
int ret = 0;
for (int i = 0; i < nums.size(); i++)
{
max_cover = max(nums[i] + i, max_cover);
if (i == cover)
{
if (cover<nums.size() - 1)
++ret;
else
break;
cover = max_cover;
}
}
return ret;
}
};