贪心基础

贪心(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. C#编程之JSON序列化与反序列化

    1.在C#管理NuGet程序包中添加Json.NET 2.C#将对象序列化成JSON字符串 模型类1 /// <summary> /// JSON字符串模型.是否出错 /// </s ...

  2. 《C# 语言学习笔记》——C# 简介

    1 什么是.NET Framework .NET Framework 是Microsoft为开发应用程序而创建的一个富有革命性的新平台. 1.1 .NET Framework 的内容 .NET Fra ...

  3. PHP中的$_POST变量

    定义 在 PHP 中,预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值. $_POST 变量 预定义的 $_POST 变量用于收集来自method ...

  4. ssh,公钥和私钥,远程复制

    ssh,公钥和私钥,远程复制 1.openssh 是一个提供远程访问控制的软件 2.ssh 远程主机用户@远程主机ip地址 ssh root@172.25.254.1 The authenticity ...

  5. SpringMVC表单对象绑定到@ModelAttribute

    支持绑定表单对象 jsp: <%@ taglib prefix="form" uri="http://www.springframework.org/tags/fo ...

  6. Java编程思想,初学者推荐看看

    这是一本介绍Java编程思想,如何从面向过程的编程思想转换为面向对象的编程思想.我个人是比较建议新手看一下的,思想掌握了,学起来自然也就会方便很多的,我还有一些Java基础的数,有需要的可以找我要,都 ...

  7. Java连接MySQL8.0以上版本数据库方式

    MySQL 8.0 开始数据库相比常用的 5.X 版本发生了比较大的变化,我们在连接数据库的过程中许多地方也要发生一些变化. 总结一下,想要利用 mysql-connector-java 与 MySQ ...

  8. 第十章 Fisco Bcos 权限控制下的数据上链实操演练

    一.目的 前面已经完成fisco bcos 相关底层搭建.sdk使用.控制台.webase中间件平台等系列实战开发, 本次进行最后一个部分,体系化管理区块链底层,建立有序的底层控管制度,实现权限化管理 ...

  9. mcrp 对接软件换

     如何配置UniMRCP Server的启动选项 UniMRCP Server的配置参数,比如:ASR server IP 地址.输出目录. 在哪儿设置这些自定义参数,在插件中如何获取这些参数. 修改 ...

  10. 恐怖的Hibernate和JavaFX Table CallBack!

    目录 [隐藏] 1 Hibernate 2 JavaFX Table Hibernate 最近在做 JavaFX 应用,不管再怎么避免数据持久化,但面对几十万的数据量的时候也只能乖乖的去配置持久层框架 ...