LeetCode题解 贪心(六):714 买卖股票的最佳时机含手续费;968 监控二叉树

714 买卖股票的最佳时机含手续费 medium

给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

这道题用动态规划也没什么问题。

但是我们还是先尝试用一下贪心的思想。贪心的话,就要在最低价购入,最高价卖出。用一个变量记录最低价。问题在于用不用找一个变量记录最高价。考虑到有手续费的存在,还要判断一下如果当天卖出会不会有收益,如果没有收益就继续持有。

随想录中给出了一种想法,就是没必要找到最高价的时候,而是一旦有钱赚,就卖出,但这时需要令最低价为当前值减去手续费,因为这么算,才能令连续计算正收益的最后一次,真正把手续费考虑进去。

例如,股票价格为1 5 9,手续费为2,第二天卖出,利润是 5 - 1 - 2 = 2元,这是记录最低价为5 - 2 = 3,在第三天卖出,利润为9 - 3 - 2 = 4元,这样一共的正收益是6元,与直接在第三天卖出是一致的。

根据上述思想,代码如下:

int maxProfit(vector<int>& prices, int fee) {
    
    
    int res = 0;
    int minPrice = prices[0];
    for (int i = 1; i < prices.size(); ++i) {
    
    
        if (prices[i] < minPrice)
            minPrice = prices[i];

        else if (prices[i] >= minPrice && prices[i] <= (minPrice + fee))
            continue;
        else {
    
    
            res += prices[i] - minPrice - fee;
            minPrice = prices[i] - fee;
        }
    }

    return res;
}

968 监控二叉树 hard

给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。

计算监控树的所有节点所需的最小摄像头数量。

这道题看样子要遍历整棵树,用动态规划做深度遍历,应该也是没什么问题的。

既然在贪心里,还是应该想想如何能做到贪心。

如果有这样一个结点,其有父结点,还有子结点,放在其自身上一个摄像头,就能同时监控至少三个摄像头。

麻烦之处在于,如何记录哪个结点放置了摄像头。可以用数字,表示每个结点的状态,状态有三种:

  • 没有摄像头监控 = 0
  • 自身就有摄像头 = 1
  • 被摄像头监控 = 2

这三种状态,在我们遍历的时候,就可以用于判断每次遍历时的情况:

  • 左右结点其中有一个是没有被监控的,那就要在当前结点放一个
  • 左右结点都有被监控,但不是有摄像头,那么说明当前结点没有被监控
  • 左右结点至少有一个摄像头,那么自己就是被监控的状态

一个特殊情况是,头结点还需要另外判断一下,如果头结点没有摄像头监控,那么就再多添一个。

根据上述分析,代码如下:

int res;
int recursion(TreeNode* cur) {
    
    
    // 因为肯定不会在叶子结点放摄像头
    if (cur == nullptr) return 2;

    int left = recursion(cur->left);
    int right = recursion(cur->right);

    if (left == 2 && right == 2) return 0;
    else if (left == 0 || right == 0) {
    
    
        res++;
        return 1;
    } else return 2;
}

int minCameraCover(TreeNode* root) {
    
    
    res = 0;
    if (recursion(root) == 0) {
    
    
        res++;
    }

    return res;
}

这道题贪心之处,就体现在不能把摄像头放在叶子结点上,否则会浪费。其余的思路,反而更像是模拟法。

猜你喜欢

转载自blog.csdn.net/qq_41205665/article/details/128888449
今日推荐