九、数学
-
剑指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); } };
-
剑指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