贪心算法2
LeetCode 122 买卖股票的最佳时机 2023.11.25
int maxProfit(vector<int>& prices) {
//result存储收益
int result = 0;
//cur存储当前手中股票价格,因为股票价格有0,所以初始化手中没股票时cur=-1
int cur = -1;
//遍历
for (int i = 0; i < prices.size(); i++)
{
//当手中没股票且当日价格小于下一日价格时买入并遍历到下一天
if(cur == -1 && i+1 < prices.size() && prices[i] < prices[i+1])
{
cur = prices[i];
continue;
}
//当手中有股票,且当日股价大于买入价,而且明天就没有价格了或者明天价格比今天低的时候卖出,更新收益
if(cur != -1 && prices[i] > cur && (i == prices.size()-1 || (i+1 < prices.size() && prices[i] > prices[i+1])))
{
result += (prices[i] - cur);
cur = -1;
}
}
return result;
}
LeetCode 55 跳跃游戏 2023.11.25
bool canJump(vector<int>& nums) {
//递归判断,从后往前推,首先遍历末尾的前一个位置
for (int i = nums.size()-2; i >= 0; i--)
{
//当前遍历位置到达不了后面的位置时,
//如果前面的位置只能到达或者到达不了当前位置时,
//一定到达不了后面的位置
if(nums[i] == 0)
{
//如果走到最前面了,说明无解了,则返回false
if(i == 0)
return false;
//定义一个标志位,用于判断前面的位置能否到达当前位置
int sym = 0;
for(int j = i-1; j >= 0; j--)
{
//如果能前面位置能到达当前位置,则sym不变直接退出
if(nums[j] > i - j)
break;
//如果前面所有的位置都走不到当前位置,则令标志位为1
if(j == 0 && nums[j] <= i - j)
sym = 1;
}
//标志位为1代表前面所有的位置都走不到当前位置,则直接返回false
if(sym == 1)
return false;
}
}
//如果前面没有返回false,那么答案为true,能走到最后!!!
return true;
}
LeetCode 45 跳跃游戏II 2023.11.25
int jump(vector<int>& nums) {
//cur变量存储当前步当前能走的最大位置,初始化为0
int cur = 0;
//next存储下一步能走的最大位置
int next = 0;
//存储走的步数
int result = 0;
//特殊情况,数组中只有1值则返回0
if(nums.size() == 1)
return result;
//开始遍历
for (int i = 0; i < nums.size(); i++)
{
//记录下一步能走的最大范围
next = max(i + nums[i], next);
//判断下一步的范围是否到达了最后
if(next >= nums.size()-1)
return result + 1;
if(i == cur)
{
cur = next;
result++;
//判断下一步的范围是否到达最后也能放在这里
// if(next >= nums.size()-1)
// break;
}
}
return result;
}