程式碼隨想錄演算法訓練營第三十二天 | 122.買賣股票的最佳時機 55.跳躍遊戲 45.跳躍遊戲II

深蓝von發表於2024-06-08

122.買賣股票的最佳時機II

題目連結 文章講解 影片講解

思路:
每次記錄當天的股票價格,如果下一天比今天的價錢高那麼今天就買,這樣保證每一次買股票都是賺的
否則記錄下一天的股票,因為下一天的股票比今天的便宜,下一天買比今天買划算

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size() <= 1) return 0;
        // 記錄當天的股價
        int cur = prices[0];
        int profit = 0;
        for(int i = 1; i < prices.size(); ++i) {
            // 如果能賺則買入
            if(prices[i] > cur) profit = profit + prices[i] - cur;
            // 否則將當前股價更新為下一天的股價
            cur = prices[i];
        }
        return profit;
    }
};

55.跳躍遊戲

題目連結 文章講解 影片講解

方法一

如果下一跳比當前值大則更新為下一跳的值
每次迴圈跳數減一,最後能夠到達陣列組後一個元素返回true,否則返回false

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int pre = nums[0];
        if(pre == 0 && nums.size() != 1) return false;
        for(int i = 1; i < nums.size(); ++i) {
            if(--pre < nums[i]) pre = nums[i];
            if(pre == 0 && i != nums.size() - 1) return false;
        }
        
        return true;
    }
};

方法二

如果當前覆蓋範圍加上當前位置能夠覆蓋整個陣列則返回true,否則返回false

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cover = 0;
        if(nums.size() == 1) return false;
        for(int i = 0; i <= cover; ++i) {
            cover = max(cover, nums[i] + i);
            if(cover >= nums.size() - 1) return true;
        }
        
        return false;
    }
};

45.跳躍遊戲II

題目連結 文章講解 影片講解

思路:cover記錄當前覆蓋範圍,maxCover記錄最大覆蓋範圍
   每當i到達當前範圍時,將cover更新為maxCover,步數加一
   如果當前範圍覆蓋到陣列最後一個元素,結束返回步數

class Solution {
public:
    int jump(vector<int>& nums) {
        if(nums.size() == 1) return 0;
        int cover = 0;
        int maxCover = 0;
        int times = 0;
        for(int i = 0; i < nums.size(); ++i) {
            maxCover = max(maxCover, nums[i] + i);
            if(i == cover) {
                cover = maxCover;
                times++;
            }
            if(cover >= nums.size() - 1) break;
        }
        return times;
    }
};

相關文章