算法笔记

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);
}

  

posted @   安小  阅读(112)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示