贪心算法
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来表示,那么,这个反例就告诉我们,贪心算法是不成立的。对于这两个问题来说,可以说是不包含贪心选择性质的。