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含有重复的值。但是不知道可以定义一个大范围,然后二分法判断有多少个数字,以及最小公倍数的使用。数学又挡住了我。

posted @ 2018-07-29 12:29  姜小豆  阅读(334)  评论(4编辑  收藏  举报