力扣(LeetCode)29. 两数相除(C++)

快速乘

题解只使用了 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;
    }
};
  1. 时间复杂度 : 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)
  2. 空间复杂度 : O ( l o g x ) O(logx) O(logx) , 预处理快速乘的空间复杂度 O ( l o g 2 x y ) O(log_2\dfrac{x}{y}) O(log2yx)

博主致语

理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。

AC

力扣(LeetCode)29. 两数相除(C++)_第1张图片

你可能感兴趣的:(墨染leetcode,c++,leetcode,算法,快速乘,预处理)