Hero Image
Leetcode 隨筆 - 62. Unique Paths

題目難度:Medium

題目連結: Unique Paths

題目大綱

給你一個 m x n 的矩陣地圖, 請你找出從座標 (0, 0) 走到 (m-1, n-1) 一共有多少種走法。題目有限制每一次只能往下或往右走一步。

解題思路

解法一 - DP

設計一個 2 維陣列 dp[m][n], 其中 dp[i][j] 對應到座標 (i, j),代表了從 (0, 0) 走到 (i, j) 一共有多少種走法。

接著從題目的限制我們可以知道,要走到 (i, j) 的話一定要先走到 (i-1, j) 或是 (i, j-1),然後再往下或往右走一步來到達 (i, j)

也就是說,走到 (i, j) 的走法數,會等於走到 (i-1, j) 的走法數加上走到 (i, j-1) 的走法數

有了這層關係,我們就可以得出 dp 的公式如下:

dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

而一開始要初始化 dp[i][0] = 1 (0 <= i <= m) 以及 dp[0][j] = 1 (0 <= j <= n),代表從起點開始,一路往右或往下都只有一種走法

Hero Image
Leetcode 隨筆 - 139. Word Break

題目難度:Medium

題目連結: Word Break

題目大綱

給定一個字串 s 和一個字串陣列 wordDict, 請你判斷是否有辦法

程式碼

解法一

這是我看完 NeetCode 影片的前半段的解題思路後想出來的解法

class Solution {
private:
    vector<int> word_len;
    int s_len;
    vector<int> dp;
public:
    void solve(string& s, int idx, vector<string>& wordDict)
    {
        if (idx >= s_len)
        {
            dp[s_len] = 1;
            return;
        }

        if (dp[idx] != -1)
            return;

        for (int i = 0; i < wordDict.size(); i++)
        {
            if (s.compare(idx, word_len[i], wordDict[i]) == 0)
            {
                solve(s, idx + word_len[i], wordDict);
                if (dp[s_len] == 1)
                    return;
            }
        }

        dp[idx] = 0;
    }

    bool wordBreak(string s, vector<string>& wordDict) {
        word_len.resize(wordDict.size(), 0);
        s_len = s.length();
        dp.resize(s_len + 1, -1);
        dp[s_len] = 0;

        for (int i = 0; i < wordDict.size(); i++)
        {
            word_len[i] = wordDict[i].length();
        }

        solve(s, 0, wordDict);
        return dp[s_len];
    }
};

解法二

NeetCode 提出的最佳解

Hero Image
Leetcode 隨筆 - 152. Maximum Product Subarray

題目難度:Medium

題目連結: Maximum Product Subarray

題目大綱

給你一個整數陣列, 找出擁有最大乘積的子陣列 (contiguous non-empty subarray)

程式碼

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int ans = nums[0];
        int max_product = 1;
        int min_product = 1;
        int t1, t2;

        for (int i = 0; i < nums.size(); i++)
        {
            t1 = max_product * nums[i];
            t2 = min_product * nums[i];
            max_product = max(t1, max(t2, nums[i]));
            min_product = min(t1, min(t2, nums[i]));
            ans = max(max_product, ans);
        }
        return ans;
    }
};