“`c++
//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {
public:
int cuttingRope(int n) {
if (n == 2) return 1;
if (n == 3) return 2;
if (n == 4) return 4;
int sum = 1;
while (n > 4) {
sum *= 3;
n -= 3;
}
sum *= n;
return sum;
}
};
class Solution {
public:
int cuttingRope(int n) {
int res = n / 3;
int rest = n % 3;
if(n <= 3){
return n - 1;
}
int sum = 0;
if(rest == 0){
sum = pow(3,res);
}
else if(rest == 1){
sum = pow(3,res - 1) * 4;
}
else{
sum = pow(3,res) * 2;
}
return sum;
}
};
class Solution {
public int cuttingRope(int n) {
if(n <= 2){
return 1;
}
if(n == 3){
return 2;
}
int res = n / 3;
int mod = n % 3;
if(mod == 0){
return pow(3, res);
}else if(mod == 1){
return pow(3, res - 1) * 4;
}else{
return pow(3, res) * 2;
}
}
//这里可以直接调用Math.pow
int pow(int a, int n){
int sum = 1;
for(int i = 1; i <= n; i++){
sum = sum * a;
}
return sum;
}
}
class Solution {
public int cuttingRope(int n) {
//数学推理
if(n <= 3) return n - 1;
int a = n / 3, b = n % 3;
if(b == 0) return (int)Math.pow(3, a);
if(b == 1) return (int)Math.pow(3, a - 1) * 4;
return (int)Math.pow(3, a) * 2;
}
}
class Solution {
public int cuttingRope(int n) {
if(n<=2) return 1;
if(n==3) return 2;
int res = n/3;
int mod = n%3;
if(mod==0){
return pow(3,res);
}else if(mod==1){
return pow(3,res-1)*4;
}else{
return pow(3,res)*2;
}
}
int pow(int a, int n){
int sum=1;
for(int i=0;i<n;i++){
sum = sum*a;
}
return sum;
}
}
共以下 18 个回答
“`c++
//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {
public:
int cuttingRope(int n) {
if (n == 2) return 1;
if (n == 3) return 2;
if (n == 4) return 4;
int sum = 1;
while (n > 4) {
sum *= 3;
n -= 3;
}
sum *= n;
return sum;
}
};
”’java
class Solution {
public int cuttingRope(int n) {
//乘积最大问题
int[] dp = new int[n + 1];
for(int i = 2;i <= n;i++){
int curMax = 0;
for(int j = 1;j < i;j++){
curMax = Math.max(curMax,Math.max(j * (i – j),j * dp[i-j]));
}
”’
时间复杂度O(n^2)
空间复杂度O(n)
找规律
时间复杂度:O(n2)
空间复杂度:O(n)
数学推导
class Solution {
public int cuttingRope(int n) {
//可以当做动态
//可以选择[n-k] * ([k]/k) 找出【k】的最长
int dp[]=new int [n+1];
dp[0]=0;
dp[1]=1;
dp[2]=1;
for(int i=3;i<dp.length;i++)
{
for(int j=2;j<i;j++)
{
dp[i]=Math.max(dp[i],Math.max(dp[i-j],i-j)*Math.max(dp[j],j));
}
}
return dp[n];
}
}
7.26
Day18:下面是代码
代码
以上是代码
硬找规律
我写的时候,直接把长度从2 到 10的答案全部手算了一遍,然后根据某种方式进行分类,例如下面这种按照余数分类。