• LeetCode contest-95[876,877,👁878]


    876. Middle of the Linked List

    first submission
    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def middleNode(self, head):
            """
            :type head: ListNode
            :rtype: ListNode
            """
            head2=head
            l=1
    
            while head.next!=None:
                head=head.next
                
                l+=1
            
            w=l//2+1
            
    
            l=1
            while head2.next!=None:
                if w==l:
                    break
                head2=head2.next
                
                l+=1  
            return head2
    

    877. Stone Game

    first submission
    import time
    
    
    class Solution:
        def stoneGame(self, piles):
            """
            :type piles: List[int]
            :rtype: bool
            """
            Alex=0
            Li=0
            flag=True # t is alex,f is li
    
            i=0
            j=len(piles)-1
    
            while i<j:
    
                if piles[i]>=piles[j]:
                    num=piles[i]
                    i+=1
                else:
                    num=piles[j]
                    j-=1
    
                if flag:
                    Alex+=num
                else:
                    Li+=num
    
            return Alex>Li
    if __name__ == "__main__":
        
        data = [
            {
                "input":[5,3,4,5],
                "output":True
            },
     
        ];
        for d in data:
            
            print(d['input'])
            
            # 计算运行时间
            start = time.perf_counter()
            result=Solution().stoneGame(d['input'])
            end = time.perf_counter()
            
            print(result)
            if result==d['output']:
                print("--- ok ---> spend time: ",end-start)
            else:
                print("--- error ---> spend time: ",end-start)
                break
            
            print()
        else:
            print("success")
    

    用到了双指针哈哈,开森

    878. Nth Magical Number

    第N个神奇数字

    如果正整数可以被 A 或 B 整除,那么它是神奇的。

    返回第 N 个神奇数字。由于答案可能非常大,返回它模 10^9 + 7 的结果。

    first submission
    class Solution:
        def nthMagicalNumber(self, N, A, B):
            """
            :type N: int
            :type A: int
            :type B: int
            :rtype: int
            """
            num=0
            if A>B:
                A,B=B,A
            ai=1
            bi=1
            for i in range(1,N+1):
                print(i,ai,A*ai,bi,B*bi,end="")
                if A*ai<B*bi:
                    num=A*ai
                    print("[1]",num)
                    ai+=1
                elif A*ai==B*bi:
                    num=A*ai
                    print("[2]",num)
                    ai+=1
                    bi+=1
                else:
                    num=B*bi
                    print("[3]",num)
                    bi+=1
    
            return num
            
    

    Time Limit Exceeded

    Last executed input:
    1000000000
    40000
    40000
    

    超时是必然的。最后结束了,就做了两道题。这道超时

    看下大神的答案【No.2 Neal@阳谷县 】

    class Solution:
        def gcd(self, a, b):
            if 0 == b:
                return a
            return self.gcd(b, a % b)
        
        def nthMagicalNumber(self, n, a, b):
            """
            :type N: int
            :type A: int
            :type B: int
            :rtype: int
            """
            c = a * b // self.gcd(a, b)
    
            lo, hi = 1, 1 << 60
    
            while lo < hi:
                mid = (lo + hi) // 2
                t = mid // a + mid // b - mid // c
                
                if t < n:
                    lo = mid + 1
                else:
                    hi = mid
            return lo % 1000000007
    
    
    分析一下大神的解法

    def gcd() 是求最大公约数

    c = a * b // self.gcd(a, b) 求最小公倍数

    lo, hi = 1, 1 << 60 构造一个大范围区间,[1,1<<60]

    mid = (lo + hi) // 2 当前中点

    t = mid // a + mid // b - mid // c 左半区间包含mid // aa,mid // bb,减去含有的最小公倍数个数mid//c,结果t则为左半区间满足数字的个数

    if t < n:
        lo = mid + 1
    else:
        hi = mid
    

    和目标格式N相比,下个目标区间

    END.

    第三题总结:其实我也也想到了要用最大公约数或者最小公倍数;想要判断AB含有重复的值。但是不知道可以定义一个大范围,然后二分法判断有多少个数字,以及最小公倍数的使用。数学又挡住了我。

  • 相关阅读:
    Linux磁盘分区实例演示
    浅谈Linux下的rpm
    You have 1 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): shopadmin. Run 'python manage.py migrate' to apply them.
    Xshell Linux常用命令
    OSError: mysql_config not found
    AttributeError: module 'datetime' has no attribute 'now'
    CentOS查看进程端口号以及kill操作
    nginx报错 nginx: [alert] kill(25903, 1) failed (3: No such process)
    3D 散点图的绘制
    关系数据库和非关系型数据
  • 原文地址:https://www.cnblogs.com/warcraft/p/9384942.html
Copyright © 2020-2023  润新知