美文网首页
2020-04-06

2020-04-06

作者: 木马音响积木 | 来源:发表于2020-04-07 06:27 被阅读0次

    针对215题,随机选择,找无序数组中第K 大的元素。

    class Solution:
        def findKthLargest(self, nums: List[int], k: int) -> int:
            i=nums
            def pp(la,l,r):
                if l==r:
                    return l
                t=la[r]
                slow=l
                for d in range(l,r):
                    if la[d]>=t:
                        la[slow],la[d]=la[d],la[slow]
                        slow+=1
                la[slow],la[r]=la[r],la[slow]
                return slow
            def d(arr,l,r,k):
                if l>=r:
                    return arr[r]
                p=pp(arr,l,r)
                if p==k-1:  #这里很重要
                    return arr[p]
                elif p>k-1:#这里很重要
                    return d(arr,l,p-1,k)
                else:
                    return d(arr,p+1,r,k)
            return d(i,0,len(i)-1,k)
    
    
    class Solution:
        def findKthLargest(self, nums: List[int], k: int) -> int:
            i=nums
            import random
            def f(w,l,r,k):
                if l>=r:return w[r]
                p=l
                b=random.randint(l,r)
                w[b],w[r]=w[r],w[b]  
                t=w[r]
                for d in range(l,r):
                    if w[d]>=t: #这里很重要
                        w[p],w[d]=w[d],w[p]
                        p+=1
                w[p],w[r]=w[r],w[p]           
        
                if p==k-1:return w[p]
                elif p>k-1:return f(w,l,p-1,k)
                else:return f(w,p+1,r,k)
            return f(i,0,len(i)-1,k)
    

    这里注意,非递归的实现,以及分区函数(独立写法)的左右双指针写法,以及逆序的写法。

    class Solution:
        def findKthLargest(self, nums: List[int], k: int) -> int:
            i=nums
            import random
            def pp(s,e):
                b=random.randint(s,e)
                i[b],i[e]=i[e],i[b]
                t=i[e]
                while s<e:
                    # >= 这里很重要
                    while s<e and i[s]>=t: s+=1
                    i[e]=i[s]
                    while s<e and i[e]<t:e-=1
                    i[s]=i[e]
                i[s]=t
                return s
    
            def f(l,r,k):
                while 1:
                    if l>=r:return i[r]
                    #p=pp(l,r)
    
                    s,e=l,r
                    b=random.randint(s,e)
                    i[b],i[e]=i[e],i[b]
                    t=i[e]                
                    while s<e:
                        #>=
                        while s<e and i[s]>=t:s+=1
                        i[e]=i[s]
                        while s<e and i[e]<t:e-=1
                        i[s]=i[e]
                    i[s]=t
                    p=s
    
                    if p==k-1:return i[p]
                    elif p>k-1:r=p-1
                    else:l=p+1
            return f(0,len(i)-1,k)
    
    class Solution:
        def findKthLargest(self, nums: List[int], k: int) -> int:
            i=nums
            def pp(la,l,r):
                t=la[r]
                slow=l
                for d in range(l,r):
                    if la[d]>=t:
                        la[slow],la[d]=la[d],la[slow]
                        slow+=1
                la[slow],la[r]=la[r],la[slow]
                return slow
    
            def d(arr,l,r,k):
                if l>=r:return arr[r]
                p=pp(arr,l,r)
                w=p-l+1 #这里很重要
                if w==k:return arr[p]
                elif w>k:return d(arr,l,p-1,k)
                else:return d(arr,p+1,r,k-w) #这里很重要
    
            return d(i,0,len(i)-1,k)
    

    随机选择的另一种写法。

    相关文章

      网友评论

          本文标题:2020-04-06

          本文链接:https://www.haomeiwen.com/subject/uvjwphtx.html