递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。
示例1:
输入:A = 1, B = 10
输出:10
示例2:
输入:A = 3, B = 4
输出:12
提示:
- 保证乘法范围不会溢出
分析:
方法:模拟+位运算
3 * 4 可以看做 4 + 4 + 4,即 A 个 B 或 B 个 A 相加,让大的那个数当加数显然更节省时间一些,当小的数减为 0 时,终止循环。因为 3 * 4 可以看做 4 + 2 * 4 = 4 + ( 4 << 1 ),因此还通过判断小的那个数是否为偶数来进行移位运算。
时间复杂度:O(log n) n 为 A、B 中最小的数,因为每遍历两次一定有一次为偶数,最优情况如 4 * 8 直接遍历 log n 次就可以了,最坏情况也不会达到 O(n)。
空间复杂度:O(log n)
class Solution {
public int multiply(int A, int B) {
//保证A比B小
if(A > B){
return multiply(B, A);
}
//A为0
if(A == 0){
return 0;
}
//A能被2整除
if(A % 2 == 0){
return multiply(A >> 1, B) << 1;
}
//递归
return B + multiply(A-1, B);
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recursive-mulitply-lcci