算法笔记
1、贪心算法
把问题分解成若干个子问题,通过局部最优解可以求得整体最优解。
缺点:贪心算法求得的结果不一定是最优解,比如要满足箱子中的东西价值最大,使用贪心策略得到的结果不一定最优。比如装箱,要满足箱子装尽可能多的东西,那么从最小的东西开始拿就可以了;但是如果要满足箱子中的东西价值最大,那么不仅要考虑体积还要考虑价格,这就不能单一地从某个维度使用贪心策略解决了。
适合用贪心算法的问题:如果每次局部最优都能保证整体也是最优解,那么贪心算法得到的结果就是最优解。
例子:计算160元最少需要几张纸币,可以每次先用最大面额的纸币来计算。先用100元计算,需要1张;然后需要50元1张,20元用不上,最后需要1张10元。
又比如,我们考试成绩要最好,那就是每个学科都要拿到最高分。
//问题:当糖果重量大于小孩的需求,表示该糖果可以满足小孩,请问这些糖果最多可以满足多少个小孩 public int greedy(int[] childs, int[] candys) { sort(childs); //将小孩需求从小到大排序 sort(candys); //将糖果重量从小到大排序 int child=0,candy=0; while(child<childs.length && candy<candys.length) { if(candys[candy]>=childs[child]) { child++; } candy++; } }
2、分治法
将一个大问题分解成若干个规模较小的子问题,每个子问题相互独立且与原问题性质相同。
例子:猜1-100中的某个数字,采用二分法策略。
条件:
1、采用分治法解决的问题是有具体范围,知道上限和下限,比如数字范围为1-100,才能进行分治;
2、采用分治的数据是有规律的,比如数字1-100是递增的,可以使用二分法求中位数;
//查找某个数在数组中的下标 public int findIndex(int[] arr, int num) { int left = 0, right = arr.length-1; while(left<right) { int mid = (left + right) / 2; if(arr[mid] > num) { right = mid; } else { left = mid; } } return mid; }
3、递归
通过调用自身方法来解决问题,问题的解决依赖于子问题的解决。
比如汉诺塔问题,要把n个盘子从A移动到B,需要先将上面的n-1个盘子挪到C,再将最后一个盘子挪到B
public void hanoi(int n, String from, String buffer, String to) { if(n == 0) { return; } hanoi(n-1, from, to, buffer); System.out.println("move from " + from +" to " + to); hanoi(n-1, buffer, from, to); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix