python摩尔投票法和二分法

摩尔投票法

摩尔投票法是对于无序数组而言的,把无序数组看作一堆选票,如果数组无序,那么就让不同的数相互抵消(一票抵消一票),最后剩下的就是多的数(选出得票最多的)。也就是“同归于尽”的算法。

leetcode(力扣)

在这里插入图片描述

算法实现

实现一个列表,第一个元素为数组第一个元素,第二个元素为0,
当列表第一个元素出现的时候就加一,否则就减一,当它的次数为负一时,把它替换为一个新的数组继续往下遍历。最终剩下的就是出现次数最多的。

#摩尔投票法
class Solution:
    def majorityElement(self, nums) -> int:
        if nums is None:
            return []
        ct=[nums[0],0]
        for i in nums:
            if ct[0]==i:
                ct[1]+=1
            else:
                ct[1]-=1
            if ct[1] == -1:
                ct=[i,0]
        return ct[0]

二分法

对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。以上是百度百科的解释,我们可以用来寻找数组中某个值,不断的分割,直到找到该值为止。

leetcode(力扣)

在这里插入图片描述

class Solution:
    def searchInsert(self, nums, target) :
        if target not in nums:
            nums.append(target)
        a=sorted(nums)
        left ,right = 0, len(a)-1
        while right >= left:
            mid=(left+right)//2
            if a[mid]==target:
                return mid
            if target>a[mid]:
                left+=1
            else:
                right-=1
        return False

其实可以直接用轮子,只不过占用内存比较大,

class Solution:
    def searchInsert(self, nums, target) :
        nums=list(nums)
        if target not in nums:
            nums.append(target)
        nums=sorted(nums)
        for i in range(len(nums)):
            if nums[i] == target:
                return i

直接用轮子占用内存为:
在这里插入图片描述
而二分法的占比是:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值