快速乘
题解只使用了
i
n
t
int
int 。
万恶的
I
N
T
_
M
I
N
INT\_MIN
INT_MIN,怎么处理?打不过就加入——被除数和除数转为负数计算 。
x x x 除以 y y y ,等于从 x x x 中拿出若干个 y y y 。 从 x x x 中拿出 y y y 的数量,就是 x ÷ y x\div y x÷y 的商。
y y y 的数量 , 用状态压缩表示。 即 2 0 / 2 1 / 2 2 … / 2 31 2^0/2^1/2^2\dots/2^{31} 20/21/22…/231 这 32 32 32 位数可以组成 0 0 0 ~ 2 31 2^{31} 231 之间任意的数 。 这么多 y y y 相加足以超过任何整形数,可以“数”出商。
我们预处理的是 y × 数 量 ( y ) y\times 数量(y) y×数量(y) , 具体实现类似快速幂 。
class Solution {
public:
int divide(int x, int y) {
if(INT_MIN == x){//两个特例
if(-1==y) return INT_MAX;
if(1==y) return INT_MIN;
}
bool is_minus = false;
if(x>0&&y<0||x<0&&y>0) is_minus = true;
if(x>0) x = -x;
if(y>0) y = -y;
vector<int> exp;
int i ;
for(i = y; i>=x&&i>=INT_MIN/2;i+=i) exp.push_back(i);
if(i<INT_MIN/2) exp.push_back(i);
int ans = 0;
for(int i = exp.size()-1;i>=0;i--){
if(x<=exp[i]){
x-=exp[i];
ans -= 1<<i;
}
}
if(!is_minus) ans = -ans;
return ans;
}
};
- 时间复杂度 : O ( l o g x ) O(logx) O(logx) , 预处理快速乘的时间复杂度 O ( l o g 2 x y ) O(log_2\dfrac{x}{y}) O(log2yx) ,求商的时间复杂度 O ( l o g 2 x y ) O(log_2\dfrac{x}{y}) O(log2yx) ,总时间复杂度 O ( 2 × l o g 2 x y ) O(2\times log_2\dfrac{x}{y}) O(2×log2yx) ,不妨忽略常数,时间复杂度 O ( l o g x ) O(logx) O(logx)。
- 空间复杂度 : O ( l o g x ) O(logx) O(logx) , 预处理快速乘的空间复杂度 O ( l o g 2 x y ) O(log_2\dfrac{x}{y}) O(log2yx) 。
博主致语
理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。