剑指提供:数组中出现次数超过一半的数字

  

题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1、2、3、2、2、2、5、4、2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

  
 <代码> # - * -编码:utf - 8 - *
  # @Time: 2019-07-08 17:21
  # @Author: Jayce黄
  # @ProjectName:工作
  # @FileName: MoreThanHalfNum.py
  # @Blog: https://blog.51cto.com/jayce1111
  # @Github: https://github.com/SysuJayce
  
  类解决方案:
  ”“”
  解法1:
  要寻找一个数组中出现次数大于一半的元素,那么很明显如果在一个有序数组中,这个元素会出现在数组中
  间,也就是统计意义上的中位数。那么通过寻找位于有序数组的中间的那个元素就可以确定这个中位的数。
  
  解法2:
  如果一个元素出现次数大于一半,那么这个元素的出现次数一定大于其他所有元素的出现次数之和。
  因此,如果我们对上一次出现的元素进行统计,最后剩下的那个元素就是我们的目标元素。
  具体来说,如果当前出现的元素和之前保存的元素不一样,那么次数1,反之+ 1。如果次数减到0了,那么
  保存当前新出现的元素。
  ”“”
  def MoreThanHalfNum_Solution2(自我、数字):
  def分区(开始、停止):
  #这个函数的作用就是确定一个元素在有序数组中的正确位置,可以用来寻找位于有序数组正中
  #间的元素
  pos=开始
  因为我在范围(开始、停止):
  如果数字[我]& lt;数字(停止):
  数字(pos),[我]=号码(我),数字(pos)
  pos +=1
  数字(停止),数字(pos)=数字(pos),数字(停止)
  返回pos
  
  如果不是数字:
  返回0
  
  中期=len(数字)在祝辞1
  开始,结束=0,len(数字)- 1
  指数=分区(开始、结束)
  虽然指数!=中期:
  #如果排好序的那个元素不在正中间,那么就根据它的位置重新确定待排序的子数组
  如果指数比;中期:=指数- 1结束
  其他:
  开始=指数+ 1
  
  指数=分区(开始、结束)
  
  #注意要检查找到的目标元素是否符合要求
  数=0
  num的数字:
  如果num==数字(指数):
  数+=1
  
  返回数字(指数)如果2 *数比;len(数字)0
  
  def MoreThanHalfNum_Solution(自我、数字):
  如果不是数字:
  返回0
  
  数=1
  ans[0]=数字
  因为我在范围(len(数字):
  #如果当前元素和保存的元素一致,那么数+ 1,反之1。
  如果数字[我]==答:
  数+=1
  其他:
  数-=1
  #如果数减到0,那么用当前元素替换之前保存的元素
  如果数& lt;=0:
  ans=数字[我]
  
  #注意要检查找到的目标元素是否符合要求
  数=0
  num的数字:
  如果num==答:
  数+=1
  
  如果数* 2在返回ans的;len(数字)0
  
  def main ():
  num=[1、2、3、2、2、2、5、4、2]
  解决方案=解决方案()
  print (solution.MoreThanHalfNum_Solution (num))
  
  if __name__==癬_main__”:
  main ()
   

剑指提供:数组中出现次数超过一半的数字