代码随想录算法训练营29期Day32|LeetCode 122,55,45

文档讲解:买卖股票的最佳时机II  跳跃游戏  跳跃游戏II

122.买卖股票的最佳时机II

题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/

思路:

        这题很简单,是要求我们买卖股票,然后算最多赚多少。

        我们可以意识到这样一件事:我们连续几天买卖股票赚的钱,其实就是我们每天赚的钱加起来就行。所以我们这道题可以这样做:判断每天是否能赚钱,能赚的话就买股票,赚的钱加入答案中,不能赚就不买。这样最后赚的钱就最多。

核心代码:

class Solution {
public:
    int maxProfit(vector& prices) {
        int ans=0;
        int n=prices.size();
        for(int i=1;i0) ans+=prices[i]-prices[i-1];
        return ans;
    }
};

55.跳跃游戏

题目链接:https://leetcode.cn/problems/jump-game/description/

思路:

        这题也很简单。我们记录从当前位置还能向下走的最大步数step。初始位于0位置,记录的最大步数step为nums[0]。

        然后我们向下走,每走一步step就减一,证明走了一步。

        每走到一个位置,我们更新step。假设当前位置为i,因为nums[i]表示从i位置开始向下的最大步数,当前的step表示从前面走到i之后还能向下走的最大步数。我们比较step和nums[i]即可,哪个大保留哪个,这样能保证向下走的更多。一直走到step为0或者位置到达 n-1 停止。

        判断最后停止的位置是否是 n-1 即可。

核心代码:

class Solution {
public:
    bool canJump(vector& nums) {
        int step=1;
        int n=nums.size();
        int i=0;
        while(istep) step=nums[i];
            if(!step) break;
            i++;
        }
        return i==(n-1)?true:false;
    }
};

45.跳跃游戏II

题目链接:https://leetcode.cn/problems/jump-game-ii/description/

思路:

        这题还行,肯定有更好的做法,但我这O(nm)的做法也过了。

        我们开一个len数组,记录到达i位置的最小跳跃数。初始值len[0]为0。

        从0位置开始,每走到一个位置,拿当前位置向后更新。假设当前位置为i,则更新i+1位置到i+nums[i]位置,比较其len值和len[i]+1 的关系,取小的即可。

        按上述方式将整个数组走一遍,输出len[n-1]即可。

核心代码:

class Solution {
public:
    int jump(vector& nums) {
        int n=nums.size();
        int len[10005];//到达i位置的最小跳跃数
        memset(len,0x7f,sizeof(len));
        len[0]=0;
        for(int i=0;i=n) break;
                len[j+i]=min(len[j+i],len[i]+1);
            }
        }
        return len[n-1];
    }
};

今日总结

        今日学习时长1h,题目还算可以,今天做题状态很好。

你可能感兴趣的:(代码随想录算法训练营29期,算法,leetcode,职场和发展,c++)