文章目录
题目分类
最易懂的贪心算法
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;