第 2 章 最易懂的贪心算法

题目分类

在这里插入图片描述

最易懂的贪心算法

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;
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值