贪心基础

贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解、从而求得整体最优解。

贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态、紧接下来的状态仅与当前状态有关。和分治、动态规划一样,贪心是一种思路,不是解决某类问题的具体方法。

应用贪心的关键,是甄别问题是否具备无后效性、找到获得局部最优的策略。有的问题比较浅显,例如一道找零钱的题目 LeetCode 860. Lemonade Change:

    // 860. Lemonade Change
bool lemonadeChange(vector<int>& bills) {
int five=,ten=;
for(auto i:bills){
if(i==) five++;
else if(i==) ten++,five--;
else if(ten>) ten--,five--;
else five-=;
if(five<) return false;
}
return true;
}

以上策略的核心就是每轮找零用最大的面额、保留尽量多5元纸币。

相关LeetCode题:

860. Lemonade Change  题解

122. Best Time to Buy and Sell Stock II  题解

1090. Largest Values From Labels  题解

870. Advantage Shuffle  题解

881. Boats to Save People  题解

984. String Without AAA or BBB  题解

但一些问题不那么直观,需要深一层考虑局部最优的策略,例如 LeetCode题目 55. Jump Game:

    // 55. Jump Game
bool canJump(vector<int>& nums) {
int res=;
for(int i=;i<=res;i++){
res=max(res,i+nums[i]);
if(res>=nums.size()-) return true;
}
return false;
}

以上每轮更新最远可以到达的位置。

相关LeetCode题:

55. Jump Game  题解

45. Jump Game II  题解

861. Score After Flipping Matrix  题解

921. Minimum Add to Make Parentheses Valid  题解

991. Broken Calculator  题解

376. Wiggle Subsequence  题解

1053. Previous Permutation With One Swap  题解

621. Task Scheduler  题解

763. Partition Labels  题解

134. Gas Station  题解

402. Remove K Digits  题解

765. Couples Holding Hands  题解

649. Dota2 Senate  题解

330. Patching Array  题解

135. Candy  题解  解释

贪心与优先级队列

一些贪心策略是每轮获取极值处理,这时可以借助于优先级队列,关于优先级队列详见:

算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)

相关LeetCode题:

1005. Maximize Sum Of Array After K Negations  题解

1046. Last Stone Weight  题解

1167. Minimum Cost to Connect Sticks  题解

767. Reorganize String  题解

502. IPO  题解

358. Rearrange String k Distance Apart  题解

贪心与排序

类似地,也可以通过排序获得极值以用于贪心策略,关于排序详见:

算法与数据结构基础 - 排序(Sort)

相关LeetCode题:

406. Queue Reconstruction by Height  题解

455. Assign Cookie  题解

1029. Two City Scheduling  题解

452. Minimum Number of Arrows to Burst Balloons  题解

435. Non-overlapping Intervals  题解

948. Bag of Tokens  题解

910. Smallest Range II  题解

759. Employee Free Time  题解

优先级队列和排序还可以一起应用于贪心策略(这类贪心策略我称之为多层贪心策略),例如针对二维数据,先对第一维排序、然后通过优先级队列对第二维取极值。

相关LeetCode题:

253. Meeting Rooms II  题解

630. Course Schedule III  题解

算法与数据结构基础 - 贪心(Greedy)的更多相关文章

  1. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  2. 算法与数据结构基础 - 分治法(Divide and Conquer)

    分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...

  3. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  4. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  5. 算法与数据结构基础 - 二叉树(Binary Tree)

    二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...

  6. 算法与数据结构基础 - 双指针(Two Pointers)

    双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...

  7. 算法与数据结构基础 - 图(Graph)

    图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...

  8. 算法与数据结构基础 - 深度优先搜索(DFS)

    DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...

  9. 算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

随机推荐

  1. Java SE API 8

    百度云: 链接:http://pan.baidu.com/s/1pLMwiKz 密码:ep5f 官网网址:http://www.oracle.com/technetwork/java/javase/d ...

  2. MetInfo企业网站管理系统 5.3 全新安装

    在phpStudy\PHPTutorial\WWW的文件下创建MetInfo文件夹.把MetInfo5.3解压到MetInfo文件夹里 用浏览器访问127.0.0.1/MetInfo 同意安装 下一步 ...

  3. 箭头函数=>

    箭头函数特点一:没有自己的this对象,其this对象为所在环境 特点二 :没有arguments参数 可以用...rest代替特点三:不能使用构造函数,不可使用new命令,否则会报错 //函数的扩展 ...

  4. 【Mac】Mac 使用 zsh 后, mvn 命令无效

    如题-- 解决方法: 将 maven 的环境变量配置放到 .zshrc 文件中. 参考链接: http://ruby-china.org/topics/23158 https://yq.aliyun. ...

  5. 【Java】Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 1099

    详细信息如下: Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: ...

  6. rocksdb编译步骤——Java、Golang、mac

    如果不是必要不建议自己编译rocksdb,编译的过程比较耗时费力.现在已经有很多编译好的文件可供使用. Java <!-- https://mvnrepository.com/artifact/ ...

  7. JDK的命令行工具系列 (一) jps、jstat

    概述 在我们进行故障定位和性能分析时, 可以使用Java Dump(也叫Dump文件)来帮助排查问题, 它记录了JVM运行期间的内存占用和线程执行等情况.其中Heap Dump文件是二进制格式, 它保 ...

  8. Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文

    前言 之前也分享了不少自己的文章,但是对于 Flink 来说,还是有不少新入门的朋友,这里给大家分享点 Flink 相关的资料(国外数据 pdf 和流处理相关的 Paper),期望可以帮你更好的理解 ...

  9. Appium+python自动化(二十七)-让你在手机找到溜冰一样的感觉666,溜得飞起来 - 低级滑动(超详解)

    简介 随着现在智能手机的普及和应用,小到五六岁或者更小的娃娃,老至七八十岁老头老太太都是智能手机的用户,基本上达到每个人都在用,每次在地铁或者公交上,就看看到这样的场面,手指不停地在手机屏幕上来来回回 ...

  10. JDK1.8源码分析01之学习建议(可以延伸其他源码学习)

    序言:目前有个计划就是准备看一下源码,来提升自己的技术实力.同时现在好多面试官都喜欢问源码,问你是否读过JDK源码等等? 针对如何阅读源码,也请教了我的老师.下面就先来看看老师的回答,也许会有帮助呢. ...