# 剑指 Offer 10- II. 青蛙跳台阶问题

1693016280313

class Solution {
public:
    int numWays(int n) {
        if (n == 0)
            return 1;
        vector<int> dp(n + 1, 0);
        int num = 1e9 + 7;
        dp[0] = dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = (dp[i - 1] + dp[i - 2]) % num;
        }
        return dp[n];
    }
};

1693017291396

# 剑指 Offer 42. 连续子数组的最大和

1693018576044

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if (nums.size() == 1)
            return nums[0];
        vector<int> dp(nums.size(), 0);
        int res;
        res = dp[0] = nums[0];
        for (int i = 1; i < nums.size(); i++) {
            dp[i] = max(nums[i], nums[i] + dp[i-1]);
            res = max(dp[i], res);
        }
        return res;
    }
};

1693019084795

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res = nums[0];
        for(int i = 1; i < nums.size(); i++) {
            if(nums[i - 1] > 0) nums[i] += nums[i - 1];
            if(nums[i] > res) res = nums[i];
        }
        return res;  
    }
};

# 剑指 Offer 46. 把数字翻译成字符串

class Solution {
public:
    int translateNum(int num) {
        string numStr = to_string(num);
        if (numStr.length() == 1)
            return 1;
        int res = 0;
        vector<int> dp(numStr.size(), 0);
        dp[0] = 1;
        if (stoi(numStr.substr(0, 2)) <= 25)
            dp[1] = 2;
        else
            dp[1] = 1;
        for (int i = 2; i < numStr.length(); i++) {
            if (numStr[i-1] != '0' && stoi(numStr.substr(i - 1, 2)) <= 25)
                dp[i] = dp[i - 2] + dp[i - 1];
            else
                dp[i] = dp[i - 1];
        }
        return dp[numStr.size() - 1];
    }
};

# 剑指 Offer 60. n 个骰子的点数

1693056459371

1693056492620

1693056506176

1693056514245

1693056523189

1693056531463

1693056538401

1693056546307

1693056554426

1693056561740

1693056569159

1693056587598

class Solution {
public:
    vector<double> dicesProbability(int n) {
        vector<double> dp(6, 1.0 / 6.0);
        for (int i = 2; i <= n; i++) {
            vector<double> tmp(5 * i + 1, 0);
            for (int j = 0; j < dp.size(); j++) {
                for (int k = 0; k < 6; k++) {
                    tmp[j + k] += dp[j] / 6.0;
                }
            }
            dp = tmp;
        }
        return dp;
    }
};

1693057309966

class Solution {
public:
    vector<double> dicesProbability(int n) {
        vector<double> dp(6,1.0/6.0); // 这是第一轮掷骰子的结果
        for(int i=2;i<=n;i++){  // 开始计算第 2 轮至第 n 轮掷骰子的结果
            vector<double> tmp(i*5+1,0); // 初始化一个容器存储本轮的全部概率,容器大小按照 5*i+1 计算
            for(int j=0;j<dp.size();j++){ // 遍历上一轮的容器
                for(int k=j;k<j+6;k++){ // 上一轮容器的每个和值,都可对本轮的 6 个和值产生影响,位置范围为 [j,j+5]
                    tmp[k] += dp[j]/6.0; // 这里除以 6.0 的意思是,基于上一轮的和值,在本轮投出 1-6 中某个点数的概率应该是:上一轮概率 *(1/6)
                }
            }
            dp = tmp;
        }
        return dp;
    }
};

# 剑指 Offer 63. 股票的最大利润

1693058115125

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int res = 0;
        int cur_min;
        if (prices.size() <= 1)
            return 0;
        
        cur_min = prices[0];
        for (int i = 1; i < prices.size(); i++) {
            if (prices[i] <= cur_min)
                cur_min = prices[i];
            else {
                res = max(res, prices[i] - cur_min);
            }
        }
        return res;
    }
};

# 剑指 Offer 48. 最长不含重复字符的子字符串

1693065869107

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.length() <= 1)
            return s.length();
        
        map<int, set<char> > mp;
        set<char> st;
        st.insert(s[0]);
        mp[0] = st;
        int res = 1;
        
        for (int i = 1; i < s.length(); i++) {
            set<char> tmp = mp[i - 1];
            set<char>::iterator it = tmp.find(s[i]);
            if (it == tmp.end()) {
                // 如果没找到,则可以连续
                tmp.insert(s[i]);
                res = max(res, (int)tmp.size());
                mp[i] = tmp;
            }
            else {
                // 如果找到
                int len = tmp.size();
                for (int j = len; j >= 1; j--) {
                    char ch = s[i - j];
                    if (ch == s[i])
                        break;
                    else {
                        tmp.erase(tmp.find(ch));
                    }
                }
                mp[i] = tmp;
            }
        }
        return res;
    }
};

1693065809272