美文网首页
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