12.05软件技术部-贪心算法培训

贪心算法

1.算法是什么

1.定义

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令内获得所要求的输出。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度衡量。

在这里插入图片描述
在这里插入图片描述

2.方法

递推法

递归法

穷举法

贪心算法:贪心算法(又称贪婪算法)是指,在对问题求解局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

分治法

动态规划法

迭代法

分支界限法

回溯法

2.贪心算法解决什么

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

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

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

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

int findCtChild(vector<int>& g,vector<int>& s) {
	sort(g.begin(),g.end(),greater<int>());
	sort(s.begin(),s.end(),greater<int>());
	int gi=0,si=0;
	int res=0;
	while(gi<g.size()&&si<s.size()) {
		if(s[si]>=g[gi]) {
			res++;
			si++;
			gi++;
		}
		else {
			gi++;
		}
	}
	return res;
}

int main() {
	
	return 0;
} 

2.给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意:可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

示例一:
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例二:
输入: [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例三:
输入: [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

struct Interval {
	int start;
	int end;
	Interval():start(0),end(0) {}
	Interval(int s,int e):start(s),end(e) {}
	
};

bool compare(const Interval &a,const Interval &b) {
	if(a.end!=b.end) 
		return a.end<b.end;
	return a.start<b.start;	
}

int intervalSched(vector<Interval>& intervals) {
	if(intervals.size()==0)
		return 0;
	sort(intervals.begin(),intervals.end(),compare);
	int res=1;
	int pre=0;
	for(int i=1;i<intervals.size();i++) {
		if(intervals[i].start>=intervals[pre].end) {
			res++;
			pre=i;
		}
	}
	return intervals.size()-res;	
} 

int main() {
	
	return 0;
}

3.局限性分析

1.贪心算法存在如下问题:

1、不能保证解是最佳的。因为贪心算法总是从局部出发,并没从整体考虑

2、贪心算法一般用来解决求最大或最小解

3、贪心算法只能确定某些问题的可行性范围

2.如何确定是否使用贪心算法?

在求解一个最优化的过程中,使用贪心的方式选择了一组内容之后,不会影响下面的子问题的求解。

1.如果无法使用贪心性质,只需要举出一个反例就可以了。

1.比如0-1背包问题

但是这个问题将1号物品和2号物品放进背包,最终得到的价值是10+12=22,这样一个反例就告诉我们贪心算法不成立

在这里插入图片描述
2.完全平方数

直觉解法就是把比这个数小的最大的完全平方数加进这个数中,比如对于12来说,最大的完全平方数是9,剩下的事情是凑3,那么比3小的最大的完全平方数就是1,最终使用贪心的算法求解出12=9+1+1+1,一共使用了4个完全平方数,可是,12可以使用3个4来表示,那么,这个反例就告诉我们,贪心算法是不成立的。对于这两个问题来说,可以说是不包含贪心选择性质的。

在这里插入图片描述

2.证明方法:反证法

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值