贪心算法简述

贪心算法

什么是贪心算法

  • 贪心的本质是选择每一阶段的局部最优,从而达到全局最优

我们举个例子,方便理解:

假设这里有十张钞票,你从中拿走五张,如果想拿到的钱数额最大,再怎么拿?

我们每次都拿最大面额的钞票,这就是局部最优;

最后我们拿到的钞票数额就是最大的,这就是全局最优;

由局部最优推出全局最优。

就这就贪心算法最基本的思想

贪心没有套路

很多同学想问,做题想不出是贪心算法,有没有什么办法或者套路,一眼就看出了要是用贪心算法。

抱歉,没有

就比如上述例题,其实我们不需要知道这种拿法是贪心算法我们都能想到,这算是一种常识思维了

一般数学证明有两种办法:

  • 数学归纳法
  • 反证法

说实话在我看来,你了解了也没什么意义,一大串公式,你都不一定能看懂,我们也不是专业的,会用就行

面试的时候就更不可能让你证明贪心算法了,最多写个代码跑一跑,证明你了解贪心算法,大多数就让你说一说即可,因为贪心算法简单题真简单,难题是真难,面试你又不是难为你。

不过我们算法中会用到一些简单的初等数学思维,甚至连初等都算不上,就比如环形链表II这道题我们就用到了简单的数学逻辑思维,你需要通过一些推到才能写出代码,如果你不推到硬写,肯定也是可以的,但那样很多细节处理起来会很麻烦的

贪心一般简体步骤

  • 将问题分解为若干个子问题
  • 找出适合的贪心策略
  • 求每个子问题的最优解
  • 将局部最优解堆成全局最优解

说实话,这个分的太细了,我们写代码的适合很难分出来,因为贪心大多数情况下会和其他知识混在一起。

455. 分发饼干

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

示例 1:

输入: g = [1,2,3], s = [1,1]
输出: 1
解释:
你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。
虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。
所以你应该输出1。
示例 2:

输入: g = [1,2], s = [1,2,3]
输出: 2
解释:
你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.

思路分析

虽然题目很长,但其实理解起来很简单,就是将饼干尽可能的满足更多的人

我们首先将两数组排序

我们肯定将大饼干优先给胃口大的小孩,给胃口小的小孩造成浪费了

在这里局部最优就是大饼干喂胃口大的小孩,全局最优就是尽可能满足更多的小孩

贪心算法简述_第1张图片
有同学说我拿最小的饼干去满足胃口尽可能小的小孩,这是一样道理的,就相当于倒序了一下

java代码:

public int findContentChildren(int[] g, int[] s) {
     
		//排序	
        Arrays.sort(g);
        Arrays.sort(s);
        //饼干的索引
        int index = s.length - 1;
        //记录满足的个数
        int result = 0;
        for (int i = g.length - 1 ; i > 0 ;i--) {
     
            if (index > 0 && s[index] >= g[i]) {
     
                index--;
                result++;
            }
        }
        return result;
    }

不要被这道题的简单所迷惑,认为贪心算法很简单,那你就大错特错了

你可能感兴趣的:(java,算法,算法,java)