力扣K神图解算法数据结构解析09

本文通过力扣K神的讲解,深入解析了数学在解决数据结构问题中的应用,包括剑指Offer系列的剪绳子问题、找数组中出现次数超过一半的数字、计算1到n整数中1出现的次数等经典问题,旨在提升读者的算法思维和数学运用能力。
摘要由CSDN通过智能技术生成

力扣K神图解算法数据结构点这里

九、数学

  1. 剑指14,剪绳子1

    //时间O(1),空间O(1)
    //需要注意几个点
    //1.3最优,2次之,1最差,相同段越多乘积越大
    //2.如果最后剩下1,要拿一个3过来和1组成2*2,因为2*2>3*1
    //3.对于第一条,其实证明也挺简单的,n=ax,试问当x为多少时,x^a最大,x^a=x^(n/x),求极值
    class Solution {
    public:
        int cuttingRope(int n) 
        {
            if(n <= 3) return n-1;
            int a = n / 3;
            int b = n % 3;
            if(b == 1) return pow(3,a-1)*4;
            else if(b == 2) return pow(3,a)*2;
            else return pow(3,a);
        }
    };
    
  2. 剑指14,剪绳子2

    //时间O(n),空间O(1)
    //两个关键点
    //1.循环求余,根据循环求余的名字可以看出必然有循环,在循环中实现pow(x,a)即连续a个x相乘由公式(a*b)%p=((a%p)*(b%p))%p;不难写出func函数,唯一需要注意的是返回值不能是int类型的而必须是long long类型的
    //2.需要注意的是,在调用完func函数后,如果func还乘有系数则同样需要%p,否则会溢出
    class Solution {
    public:
        int cuttingRope(int n) 
        {
            if(n <= 3) return n-1;
            int a = n / 3;
            int b = n % 3;
            int p = 1e9+7;
            //在调用完func函数后也需要%p,因为乘了个系数,勿忘
            if(b == 1) return func(3,a-1,p) * 4 % p;
            else if(b == 2) return func(3,a,p) * 2 % p;
            else return func(3,a,p);
        }
    private:
        long long func(int x,int a,int p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值