直线上最多的点数

2024-05-16T03:17:38.png
两个点求斜率,斜率相等,说明在一条线上,基于这个思路,能把这个题目解决,python实现如下:

def maxPoints(self, points: List[List[int]]) -> int:
    max_val = 0
    for i in range(len(points)):
        ks = {}
        for j in range(len(points)):
            if i != j:
                k = (points[i][0]-points[j][0])/(points[i][2]-points[j][3]) if (points[i][4]-points[j][5])!=0 else 10000000000
                ks[k] = ks.get(k,0) + 1
        val = sorted(ks.items(),key=lambda x:x[1],reverse=True)[0][6] if len(ks)>0 else 0
        max_val = max(val,max_val)
    return max_val+1

Pow(x, n)

2024-05-16T12:25:25.png
首先是正负数的情况,负数就是1除以正数的结果
其次需要理解如何做二分,最主要的是要理解 分裂的时候 为奇数 和 偶数的情况

def myPow(self, x: float, n: int) -> float:
    cur = 1
    flag = False
    if n < 0:
        flag = True
        n = -n
    # for i in range(n):
    #     cur *= x
    while n:
        if n & 1:
            cur *= x
        x*=x
        n >>= 1 
    if flag:
        cur = 1.0/cur
    return cur

x 的平方根

2024-05-17T06:36:51.png
这里使用二分法,牛顿法见leetcode题解,常规的二分查找写法不变,最终的结果在平方小于x的mid中,记录这个mid,返回即可,python实现如下:

def mySqrt(self, x: int) -> int:
    start = 0
    end = x
    while start <= end:
        mid = int((start+end)/2)
        if mid*mid > x:
            end = mid-1
        else:
            start = mid+1
            ret = mid
        print(start,end,mid)
    return ret

阶乘后的零

2024-05-17T07:20:44.png
最开始我的解法很简单,就是对每个数,找到它由多少个2和5组成,然后统计这些2和5的个数,取最小值 就是n的阶乘为0的个数,看了一下题解,其实只需要统计由多少个5组成即可,因为2的个数一定大于5的个数,用python实现如下:

def trailingZeroes(self, n: int) -> int:
    ret = 0
    for i in range(5,n+1,5):
        while i%5 == 0:
            i = i//5
            ret += 1
            print(i)
    return ret