贪心算法 —— 每时每刻都要做最好的( $ _ $ )

算法思想介绍

贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体 最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行 的第一个基本要素。 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。运用贪心策略在每一次转化时 都取得了最优解。问题的最优子结构性质是该问题可用贪心算法求解的关键特征。贪心算法的每一次操作都对 结果产生直接影响。贪心算法对每个子问题的解决方案都做出选择,不能回退。 贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获 得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在 一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止。 实际上,贪心算法适用的情况很少。一般对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实 际数据进行分析,就可以做出判断。

总之:贪心算法,不考虑全局,每一步最优解,最终叠加组合,得到最优解,局部最优解就是当前最优解,就是解题的约束条件

过程

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

简单来说就是:假设一个问题比较复杂,暂时找不到全局最优解,那么我们可以考虑把原问题拆成几个小问题(分而治 之思想),分别求每个小问题的最优解,再把这些“局部最优解”叠起来,就“当作”整个问题的最优解了

该算法存在的问题

不能保证求得的最后解是最佳的 不能用来求最大值或最小值的问题 只能求满足某些约束条件的可行解的范围

举例

通过下面的例子,了解贪心的思想吧~

  1. 选择排序

我们学的排序算法之一的选择排序,就用到了贪心的算法,我们可以通过每次遍历序列的方式寻找最小的数,将他与序列的第一个位置交换,然后再从剩下的位置中寻找最小的数,再次交换到前面去,最终就得到一个有序数组

void selectSort(int* arr, int n)//arr数组(元素个数为n)排序
{
    for (int i = 0; i < n; ++i)//i限定了一段区间
    {
        int curIndex = i;//curIndex记录遍历所到之处目前最小元素的下标
        for (int j = i + 1; j < n; ++j)
        {
            if (arr[curIndex] > arr[j])//遍历剩余元素,找到最小的元素下标
                curIndex = j;
        }
        swap(arr[curIndex], arr[i]);
    }
}
  1. 平衡字符串

https://leetcode-cn.com/problems/split-a-string-in-balanced-strings/

平衡字符串 中,'L' 和 'R' 字符的数量是相同的。给你一个平衡字符串 s,请你将它分割成尽可能多的子字符串,并满足:

  • 每个子字符串都是平衡字符串。返回可以通过分割得到的平衡字符串的 最大数量

示例:

输入:s = "RLRRLLRLRL"

输出:4

解释:s 可以分割为 "RL"、"RRLL"、"RL"、"RL" ,每个子字符串中都包含相同数量的 'L' 和 'R'

输入:s = "RLRRRLLRLL"

输出:2

解释:s 可以分割为 "RL"、"RRRLLRLL",每个子字符串中都包含相同数量的 'L' 和 'R' 。

注意,s 无法分割为 "RL"、"RR"、"RL"、"LR"、"LL" 因为第 2 个和第 5 个子字符串不是平衡字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值