LeetCode 122买卖股票的最佳时机 55跳跃游戏 45跳跃游戏II | 代码随想录25期训练营day32

贪心算法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;
}

猜你喜欢

转载自blog.csdn.net/weixin_66706867/article/details/134612974
今日推荐