LCR 001.两数相除

题目来源:

        leetcode题目:LCR 001. 两数相除 - 力扣(LeetCode)

解题思路:

       通过ab的符号位获得结果的符号位后将两个取绝对值。通过累加获得 1*b(除数),2*b,4*b,8*b,16*b.......的值,倒序遍历累加获得小于等于a的最大值,其前面的乘数之和即为所求。有点类似于分治。

解题代码:

#python3
class Solution:
    def getSymbol(a:int, b:int)->int:
        if a>0 and b>0:
            return 1
        elif a>0 and b<0:
            return -1
        elif a<0 and b>0:
            return -1
        else:
            return 1

    def divide(self, a: int, b: int) -> int:
        maxNum=2**31-1
        minNum=0-(2**31)
        resSymbol=Solution.getSymbol(a,b)
        a=abs(a)
        b=abs(b)
        
        list1=[]
        merge=b
        cutRemain=1
        while(merge<=a):
            list1.append([merge,cutRemain])
            merge=merge+merge
            cutRemain=cutRemain+cutRemain
        
        sum=0
        res=0
        for temp in list1[::-1]:
            if sum+temp[0]<=a:
                sum=sum+temp[0]
                res=res+temp[1]
        res=res if resSymbol>0 else 0-res
        return res if res<=maxNum and res>=minNum else maxNum
        
 
  

总结:

        暴力累加会超时,优化了一次有一次,简单题写了一小时.......

        官方题解提供了二分和类二分两种解法。快速幂算法:从x开始,每一次将上次的结果取平方,从而避免累乘x。


你可能感兴趣的:(LeetCode,刷题,LeetCode)