week13

121 - 买卖股票的最佳时机

记录从 1 ~ i - 1 的价值最小值买入, 当前卖出的价值,维护其最大值即可;

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int minv = 2e9, res = 0;
        for(auto p : prices)
        {
            res = max(res, p - minv);
            minv = min(minv, p);
        }
        return res;
    }
};

122 - 买卖股票的最佳时机ii

avatar

长交易分解 把一整段交易可以拆成每天买入每天卖出, 然后组合即为所有交易的情况;

所以最后最大的盈利 就是将每一天卖出买入为正的所有情况加起来;

123 - 买卖股票的最佳时机iii

这题当然可以用DP去做了, 但是可以对于这种分成两段的问题,可以枚举中间的分界点,前后缀分离来完成;

avatar

先遍历一遍记录前半段的最大利润f[i], 再从后往前遍历 求得后半段的最大值即可;

124 - 二叉树的最大路径和

一般树🌲中枚举路径 都是枚举最高点 (LCA 最近公共祖先)

再去找左子树最大路径和,右子树的最大路径和 (因为两边独立)

这样dfs的返回值是沿着当前节点往下走的最大路径和:三种情况 当前点停下, 向左走, 向右走

并维护一个全局的答案 记录左右两边和的最大值;

这里左右两边都是可选可不选的;

125 - 验证回文串

基础双指针遍历, 记一下几个字符的库函数

isdigit: 判断字符是否是0-9的数字

isalpha: 判断字符是否是字符 大小写都行

isalnum: 上面两个的综合

tolower/toupper: 大小写字符转换,不是字母的话会直接返回传入的字符

126 - 单词接龙ii

实际上是图论上的最短路问题,各边权都是1 -> bfs 可以解决

重点在建图上,这里图的构建用中间状态来代表 abc -> a*c 表示替换字母后的状态

建图方式有两种: 两两枚举是否能建边(n^2xL) 或者 枚举每个单词的每个字母 (26xnxL) 这里我们采用枚举每个单词的每个字母,用一个中间状态表示;

最后复习一下最短路如何记录方案: 首先记录每个点到终点的最短距离,然后枚举邻接表

如果满足dist[t] + 1 = dist[next] 就证明从t到next的这一段在最短路上, dfs搜索记录就可以了;

127 - 单词接龙

这题不用记录方案 直接抄上面题的代码也是可以的,但不用记录方案还是搞双向广搜会快一些(好像也没有快)

128 - 最长连续序列

首先将所有数字放入哈希表,遍历哈希表中的元素,因为要找连续的数字序列,因此可以通过向后枚举相邻的数字(即不断加一),判断后面一个数字是否在哈希表中即可。

为了保证O(n)的复杂度,同时也为了避免重复枚举序列,因此只对序列的起始数字向后枚举(例如[1,2,3,4],只对1枚举,2,3,4时跳过),因此需要判断一下是否是序列的起始数字(即判断一下n-1是否在哈希表中)。

129 - 求根到叶子节点数字之和

树🌲上的遍历分为两种,从上到下和从下到上的; 从下到上就是经典的递归做返回值,这里从上倒下则是用参数传递的形式来完成;

130 - 被围绕的区域

搜索题了 这里可以在边界上的O做为起点 搜索,没搜到的都记作X就好了

判重这里可以直接在原数组上改

Last updated