数据结构与算法学习(第八天)

贪心

在这里插入图片描述

练习一:加勒比海盗

在这里插入图片描述

练习二:零钱兑换

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

注意

在这里插入图片描述

练习三:0-1背包问题

在这里插入图片描述

分治

在这里插入图片描述

主定理

在这里插入图片描述

主定理求时间复杂度,依然利用递归树来推(加点估算),只是还得用对数的一个定理,不是换底公式!

换底公式:
在这里插入图片描述

主定理涉及的对数定理:

在这里插入图片描述

思考

在这里插入图片描述

因为针对具体算法实现时,减少数据量可以使最终操作次数减少。
如:假设对n个数据排序时间复杂度为O(n2),而将n个数据拆成两份,两份各自进行排序,最终时间复杂度为
O(n2 /4) + O(n2 /4) + O(合并消耗的时间)

上述是分治策略最重要的核心,这也是我觉得它与普通递归最大的区别,合并消耗的时间过大的话,分治反而增大了时间复杂度

练习-最大连续子序列和

在这里插入图片描述

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

上面那道leetcode题现在如下图:

在这里插入图片描述

提交的答案:

class Solution {
    public class Status{
        public int lsum, rsum, isum, msum;
        public Status(int lsum, int rsum, int isum, int msum){
            this.lsum = lsum;
            this.rsum = rsum;
            this.msum = msum;
            this.isum = isum;
        }
    }

    public int maxSubArray(int[] nums) {
        return getInfo(nums, 0, nums.length-1).msum;
    }

    public Status getInfo(int[] nums, int l, int r){
        if(l == r){
            return new Status(nums[l], nums[r], nums[l], nums[l]);
        }

        int m = (l+r)/2;
        Status lsub = getInfo(nums, l, m);
        Status rsub = getInfo(nums, m+1, r);
        return pushUp(lsub, rsub);
    }

    public Status pushUp(Status l, Status r){
        int isum = l.isum + r.isum;
        int lsum = Math.max(l.lsum, l.isum + r.lsum);
        int rsum = Math.max(r.rsum, r.isum + l.rsum);
        int msum = Math.max(Math.max(l.msum, r.msum), l.rsum+r.lsum);
        return new Status(lsum, rsum, isum, msum);
    }

}

大数乘法 - karatsuba算法

在这里插入图片描述

未进行优化时,使用分治法进行大数乘法时间复杂度一样是O(n)

karatsuba算法

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸数得五

谢谢您的打赏勒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值