摩尔投票法和二分法
摩尔投票法
摩尔投票法是对于无序数组而言的,把无序数组看作一堆选票,如果数组无序,那么就让不同的数相互抵消(一票抵消一票),最后剩下的就是多的数(选出得票最多的)。也就是“同归于尽”的算法。
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
直接用轮子占用内存为:
而二分法的占比是: