美文网首页
2019-08-13 剑指 数组中出现次数超过一半的数字

2019-08-13 剑指 数组中出现次数超过一半的数字

作者: mztkenan | 来源:发表于2019-08-13 12:59 被阅读0次

30min
1.如何循环的写分治有点卡壳
2.针对非法输入进行处理

class Solution:
    def MoreThanHalfNum_Solution(self, numbers):
        if not numbers:return 0
        mid=(0+len(numbers)-1)//2
        start,end=0,len(numbers)-1
        p=self.partition(numbers,start,end)
        while p!=mid:
            if p<mid:
                start=p+1 # 这里要进行改变
            else:
                end=p-1
            p=self.partition(numbers,start,end)
        res=numbers[mid]  # 注意非法输入,不存在
        cnt=0
        for n in numbers:
            if n==res:cnt+=1
        if cnt>(len(numbers)/2):return res
        else:return 0



    def partition(self,numbers:List,l:int,r:int)->int:
        pivot=numbers[r]
        small=l-1
        for i in range(l,r):
            if numbers[i]<=pivot:
                small+=1
                if small!=i:numbers[i],numbers[small]=numbers[small],numbers[i]
        small+=1
        numbers[small],numbers[r]=numbers[r],numbers[small]
        return small

转换为迭代写法。可以参考二分查找思路

       if not numbers:return 0
        mid=(0+len(numbers)-1)//2
        self.dfs(numbers,0,len(numbers)-1,mid)

        res=numbers[mid]  # 注意非法输入,不存在
        cnt=0
        for n in numbers:
            if n==res:cnt+=1
        if cnt>(len(numbers)/2):return res
        else:return 0

    def dfs(self,numbers,l,r,mid):
        p=self.partition(numbers,l,r)
        if p<mid:self.dfs(numbers,p+1,r,mid)
        elif p>mid:self.dfs(numbers,l,p-1,mid)

    def partition(self,numbers:List,l:int,r:int)->int:
        pivot=numbers[r]
        small=l-1
        for i in range(l,r):
            if numbers[i]<=pivot:
                small+=1
                if small!=i:numbers[i],numbers[small]=numbers[small],numbers[i]
        small+=1
        numbers[small],numbers[r]=numbers[r],numbers[small]
        return small

相关文章

网友评论

      本文标题:2019-08-13 剑指 数组中出现次数超过一半的数字

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