剑指 Offer 14- II. 剪绳子 II
题目:
思路:
区别于DP,使用贪婪算法。3就是最贪婪的,但是对于4,不能使用33,而是要使用22,所以进行了特殊处理。
注意:代码的实现,根据题意还是要考虑边界问题,可以在以下两点进行思考:
1.是不是要使用long
2.在那个位置进行取模是绝对正确的
代码:
class Solution {
public int cuttingRope(int n) {
if (n == 2) {
return 1;
} else if (n == 3) {
return 2;
}
int c = n / 3;
int d = n % 3;
int result = 0;
// 对于4,5, 6要进行特殊处理
if (d == 1) {
result = (int)(pow(3, c - 1) * 4 % 1000000007);
} else if (d == 0) {
result = (int)pow(3,c);
} else if (d == 2) {
result = (int)(pow(3,c) * 2 % 1000000007);
}
return result;
}
private long pow(int i, int count) {
int temp = i;
//这个必须用long计算,否则结果不正确
long j = i;
if(count == 0){
return 1;
}
while (--count > 0) {
j *= temp ;
j = j % 1000000007;
}
return j;
}
}
空间复杂度不好的原因主要是由于 temp变量,将其写死为3,这里就会有提升。但是自己的代码实现有点复杂,参考其他答案的写法后:
1.将4,5,6的考虑不使用if,直接进行n-3
2.pow不复杂,也是整合到n-3中
但是代码实现简单:
class Solution {
public int cuttingRope(int n) {
if (n == 2) {
return 1;
} else if (n == 3) {
return 2;
}
long result = 1;
// 不自定义那么多的函数,直接进行-,* 即可
while (n > 4) {
result *= 3;
result = result % 1000000007;
n -= 3;
}
// 进行特殊处理,*2,*3等
return (int) (result * n % 1000000007);
}
}