当前位置:网站首页>#yyds干货盘点# 解决剑指offer:剪绳子(进阶版)
#yyds干货盘点# 解决剑指offer:剪绳子(进阶版)
2022-06-27 12:46:00 【51CTO】
1.简述:
描述
给你一根长度为 n 的绳子,请把绳子剪成整数长的 m 段( m 、 n 都是整数, n > 1 并且 m > 1 , m <= n ),每段绳子的长度记为 k[1],...,k[m] 。请问 k[1]*k[2]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18 。
由于答案过大,请对 998244353 取模。
数据范围:进阶:空间复杂度
, 时间复杂度
示例1
输入:
返回值:
说明:
示例2
输入:
返回值:
说明:
示例3
输入:
返回值:
2.代码实现:
import java.util.*;
public class Solution {
private long mod = 998244353;
//快速乘法
private long fast(long x, long y){
long res = 0;
x %= mod;
y %= mod;
while(y != 0){
if((y & 1L) != 0){
//加法代替乘法,防止越界
res += x;
if(res >= mod)
res -= mod;
}
y = y >> 1;
x = x << 1;
if(x >= mod)
x -= mod;
}
return res;
}
//快速幂
long Pow(long x, long y){
long res = 1;
while(y != 0){
//可以再往上乘一个
if((y & 1L) != 0)
res = fast(res, x);
//叠加
x = fast(x, x);
//减少乘次数
y = y >> 1;
}
return res;
}
public long cutRope (long number) {
//不超过3直接计算
if(number <= 3)
return number - 1;
//能整除3
if(number % 3 == 0)
return Pow(3, number / 3);
//最后剩余1
else if(number % 3 == 1)
//4*3^{n-1}
return fast(Pow(3, number / 3 - 1), 4);
//最后剩余2
else
//2*3^n
return fast(Pow(3, number / 3), 2);
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
边栏推荐
猜你喜欢
随机推荐
IJCAI 2022 | 用一行代码大幅提升零样本学习方法效果,南京理工&牛津提出即插即用分类器模块
让学指针变得更简单(二)
【动态规划】—— 背包问题
[medical segmentation] unet3+
Istio微服务治理网格流量管理核心资源控制器详解
新华三的千亿企业梦,还得靠吃ICT老本来实现?
防火墙基础之华为华三防火墙web页面登录
zabbix支持钉钉报警
VS调试技巧
夏日里的清凉
What kind of air conditioner is this?
Openfeign service interface call
An interesting experiment of netmask
今天运气不错
convn-N 维卷积
OpenFeign服务接口调用
Neo4j: basic introduction (I) installation and use
[dynamic programming] - Knapsack Problem
PyCharm汉化
云原生(三十) | Kubernetes篇之应用商店-Helm