第 2 章 最易懂的贪心算法

本文详细介绍了贪心算法的思想,通过分析455. 分发饼干和135. 分发糖果等例子,阐述了如何使用贪心算法解决分配问题。同时,探讨了435. 无重叠区间问题,展示了如何运用贪心策略找到最小移除区间数。此外,还提供了多种练习题目的解决方案,包括种花问题、用最少数量的箭引爆气球等,深入浅出地讲解了贪心算法的应用。
摘要由CSDN通过智能技术生成

题目分类

在这里插入图片描述

最易懂的贪心算法

2.1算法思想:

保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。

2.2 分配问题

455. 分发饼干

题目描述
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
来源:力扣(LeetCode)
输入输出样例
输入: g = [1,2,3], s = [1,1]
输出: 1
输入: g = [1,2], s = [1,2,3]
输出: 2

方法一:使用快速排序
算法思想:

  • 先通过快速排序对两个数组进行排序。
  • 饼干尺寸与小孩胃口值进行比对。
    尺寸>=胃口值,num++,饼干符合最小胃口值,当下最优分配。
    尺寸<胃口值,饼干不符合最小胃口值,换下一个饼干去匹配最小胃口值。
    (给每个小孩的饼干都是刚刚好大于他们的胃口值,即当下最优解)
function quick_sort(arr,from,to){
   
	var i = from; //哨兵i
	var j = to; //哨兵j
	var key = arr[from]; //标准值
	if(from >= to){
    //如果数组只有一个元素
	   return;
	}
	while(i < j){
   
		while(arr[j] > key && i < j){
    //从右边向左找第一个比key小的数,找到或者两个哨兵相碰,跳出循环
			j--;
		}
		while(arr[i] <= key && i < j){
     //从左边向右找第一个比key大的数,找到或者两个哨兵相碰,跳出循环,这里的=号保证在本轮循环结束前,key的位置不变,否则的话跳出循环,交换i和from的位置的时候,from位置的上元素有可能不是key
			i++;
		}
		/**
		  代码执行道这里,1、两个哨兵到找到了目标值。2、j哨兵找到了目标值。3、两个哨兵都没找到(key是当前数组最小值)
		**/
		if(i < j){
    //交换两个元素的位置
			var temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;

		}
	}
	arr[from] = arr[i] //
	arr[i] = key;
    quick_sort(arr,from,i-1);
	quick_sort(arr,i+1,to);
}
var findContentChildren = function(g, s) {
   
    var num=0;
    quick_sort(g,0,g.length-1);
    quick_sort(s,0,s.length-1);
    for(var i = 0,j = 0;i < g.length,j < s.length;j++ ){
   
        if(g[i]<=s[j]){
   num++;i++;}
    }
    return num;
};

运行结果:

复杂度
时间复杂度:O(2nlogn+n) ~ O(nlogn)
空间复杂度:
扩展知识:
快速排序:https://blog.csdn.net/zhao529670074/article/details/80776253
复杂度:
最优的情况下时间复杂度为:O( nlogn )
最差的情况下时间复杂度为:O( n^2 )
平均时间复杂度也是:O(nlogn)
最优的情况下空间复杂度为:O(logn)
最差的情况下空间复杂度为:O( n )
稳定性:不稳定
方法二:使用自带排序算法

var findContentChildren = function(g, s) {
   
    var num=0;
    g.sort((a,b)=>a-b);
    s.sort((a,b)=>a-b);
    for(var i = 0,j = 0;i < g.length,j < s.length;j++ ){
   
        if(g[i]<=s[j]){
   num++;i++;}
    }
    return num;
};

在这里插入图片描述

135. 分发糖果

方法一:递归
思路过于复杂且混乱

function cd(ratings,leftNum,i,num){
   
    var tempNum=-1;
	var current=1;
	if(i>ratings.length-1){
   return num;}//完成
	if(i==0)//leftNum>=1;
	{
   
	    while<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
梯度投影算法贪心算法是两种常见的优化算法,各自有着自己的优点和缺点。 梯度投影算法(Gradient Projection Algorithm)是一种迭代算法,用于求解约束优化问题。它的优点包括: 1. 收敛性:梯度投影算法在适当的条件下可以保证收敛到全局最优解或者局部最优解。 2. 简单性:相对于其他复杂的优化算法,梯度投影算法较为简单易懂,实现起来相对容易。 3. 适用性:梯度投影算法可以处理非光滑、非凸以及约束条件复杂的优化问题。 然而,梯度投影算法也有一些缺点: 1. 速度较慢:梯度投影算法每次迭代需要计算梯度和进行投影,计算量较大,因此在大规模问题上可能会比较耗时。 2. 受初始点影响:梯度投影算法对初始点敏感,不同的初始点可能会导致不同的收敛结果。 3. 局部最优解:由于梯度投影算法的迭代性质,可能会陷入局部最优解而无法找到全局最优解。 贪心算法(Greedy Algorithm)是一种基于局部最优选择的算法,每次选择当前最优解,通过迭代逐步构建出全局最优解。贪心算法的优点包括: 1. 简单性:贪心算法通常比较简单易懂,易于实现和理解。 2. 效率较高:贪心算法通常具有较高的执行效率,适用于大规模问题。 3. 可应用范围广:贪心算法适用于一些特定类型的问题,如最小生成树、最短路径等。 然而,贪心算法也有一些缺点: 1. 局部最优解:贪心算法每次只考虑当前最优选择,无法保证一定能获得全局最优解。 2. 缺乏回溯性:贪心算法做出的每个选择都是基于当前状态的最优决策,无法回溯到之前的选择进行修改。 3. 不适用于部分问题:对于某些问题,贪心算法可能无法得到正确的解,例如涉及到约束条件和限制的问题。 综上所述,梯度投影算法贪心算法都有各自的适用范围和局限性,需要根据具体问题的性质和要求选择合适的算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值