LeetCode-765 情侣牵手-(2)什么是贪心算法

定义

所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。

贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。

贪心算法是一种特殊的动态规划算法,不一样的是贪心算法是局部最优解,动态规划是全局最优解。实际上大部分问题无法通过贪心算法获得最优解。

如果对矩阵求解的梯度下降法了解的话,贪心算法就比较好理解。

解释

从前有一只鹅,一天可以下两个金蛋,但是直接杀了他可以拿到二十个金蛋。问在21天内拿到尽量多的金蛋?

动态规划 => 前20天不杀,最后一天杀。40个

贪心算法 => 若第一天下蛋,得到一个金蛋;若第一天杀,得到20个金蛋。则选择第一天杀。

使用说明

贪心算法一般按如下步骤进行:

  1. 建立数学模型来描述问题
  2. 把求解的问题分成若干个子问题
  3. 对每个子问题求解,得到子问题的局部最优解
  4. 把子问题的解局部最优解合成原来解问题的一个解

解决【情侣牵手】问题

通过不断的交换情侣让情侣坐到一起,那么对于每次交换,有2种情况:

  • 交换1次,1对情侣坐到了一起

【A男、B男】、【C男、A女】、【B女、C女】
=>
【A男、A女】、【C男、B男】、【B女、C女】

变换1次,将(B男)与(A女)调换位置,形成【A男、A女】1对情侣

  • 交换1次,2对情侣坐到了一起

【A男、B男】、【B女、A女】
=>
【A男、A女】、【B女、B男】

变换1次,将(B男)与(A女)调换位置,形成【A男、A女】、【B女、B男】2对情侣

交换1次,2对情侣坐到了一起【优于】交换1次,1对情侣坐到了一起

因此,每次变换时候对数组进行遍历,查看是否有可以变换1次形成2对情侣,如没有则进行变换1次形成1对情侣,直到捋顺所有情侣。

参考

  1. https://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741375.html
  2. 什么是贪心算法? - 傻天才的回答 - 知乎
  3. https://blog.csdn.net/effective_coder/article/details/8736718
  4. https://baike.baidu.com/item/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95/5411800?fr=aladdin

你可能感兴趣的:(LeetCode-765 情侣牵手-(2)什么是贪心算法)