DAY17-贪心

其实贪心只是一种思路,时常体现在各种算法里面,像之前讲的最小生成树(prim),最短路径(Dijkstra)就是展现了贪心的思路。

  • 最小生成树 - prim
    ((用priority_queue(堆)实现贪心思想(利用pq来搜索路径)
    ((取出pq最前面的元素,放入相邻的节点))
  • 最短路径 - Disjkstra
    ((基於贪心思想,从起点找一个离起点最近的节点->这一个边无法再松弛->用这一个边去对其他边松弛))

这种题目也没有固定的做法,只是遵循这种思路再去设计贪心的策略,就整理几题~~


例题实战

122. 买卖股票的最佳时机 II
这题乍看下是DP,但其实贪心思路是可以求出答案的~~
原因是最佳解就只是每一段上升价差的和((掌握到最好的价差时间,也只能获得每一段价差和)),所以是一个贪心思路,直接算整个数组上升和

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

1833. 雪糕的最大数量
没别的..就先从便宜的开始买..

class Solution {
public:
    int maxIceCream(vector<int>& costs, int coins) {
        sort(costs.begin(), costs.end());
        int res = 0;
        for(int i = 0; i<costs.size(); ++i){
            if(coins>=costs[i]){
                coins-=costs[i];
                res++;
            }
        }
        return res;
    }
};

11. 盛最多水的容器
贪心思路:从两侧开始移动,比较左右边界,如果其中一侧比较矮,先移动那一侧(才有可能使容量变大)

class Solution {
public:
    int maxArea(vector<int>& height) {
        int res = 0;
        int l = height.size()-1;
        int r = 0;
        while(r<l){
            res = max(res, (l-r)*min(height[l], height[r]));
            if(height[r]<height[l]){
                r++;
            }
            else{
                l--;
            }
        }
        return res;
    }
};

其他应用

机器学习中,Decision Trees,也是用到这种思路去选择树的建构~~


<<:  【3】训练前先暖身 - 学习率 Warm-up 策略

>>:  Day 04:大O符号的含意

Day_28:让 Vite 来开启你的Vue之 跌入深坑_生命周期 hooks 与 async/await

Hi Dai Gei Ho~ 我是Winnie ~ 在今天的文章中,我们要简单来说说 在 Lifec...

人生的十字路口,选择自己想走的路

了解各个工具的特性,并相互运用 讲完EC2的架构图以及介绍後,首先会介绍有哪些AWS服务可以去建置部...

Re: 新手让网页 act 起来: Day04 - JSX

前言 前面两篇基础的介绍 React.createElemnt(),但实际再开发上很少真的直接写它,...

产品成长策略 - 安索夫矩阵

一家公司很难单靠一个产品来获利,就像 原来产品也有自己的生命历程 Product Life Cycl...

Day 11 : 操作基础篇 8 - 倍速提升你的操作速度,14 个 Obsidian 快捷键设定建议

前言 这是 Obsidian 使用教学 — 基础篇的第 8 篇文章。 在 上一篇文章 中,我介绍了一...