力扣刷题(十二)--求众数--python语言描述--majorityElement

题目描述:
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在众数。

示例 1:
输入: [3,2,3]
输出: 3

示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2

方法一、
利用while循环,使得重复运行,直到列表同样的数的长度超过了n/2截至。

  • record_numbers存储原始数组中相同的元素
  • 如果同样的“a”不符合条件,则在原始数组中把“a”删除,再从“b”开始做。但是一定要注意的是删除操作中,如果删除了,会改变索引位置。因此必须从右往前删除,而不可以从左往右删除。具体的:
				for i in range (len(nums)-1,-1,-1):
                    if nums[i] == record_numbers[0]:
                        nums.remove(nums[i])

从上面的代码可以看出来,range函数有三个参数,以此为start,end,step。其中,start不一定必须比end小,只要最后可以从start算到end即可!
还要注意的是,remove删除只能删除遇到的第一个符合条件的值,如果想要把所有的都删除必须在循环中实现。

code:

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        numbers = len(nums)/2
        record_numbers = []
        
        while len(record_numbers) <= numbers:
      
            if record_numbers:
                for i in range (len(nums)-1,-1,-1):
                    if nums[i] == record_numbers[0]:
                        nums.remove(nums[i])
                        
            result = nums[0]            
            record_numbers = []            
            for i in range(0, len(nums)):
                if nums[i] == result:
                    record_numbers.append(nums[i])
        
        return record_numbers[0]

官方解答:
力扣刷题(十二)--求众数--python语言描述--majorityElement_第1张图片

class Solution:
    def majorityElement(self, nums):
        majority_count = len(nums)//2
        for num in nums:
            count = sum(1 for elem in nums if elem == num)
            if count > majority_count:
                return num

力扣刷题(十二)--求众数--python语言描述--majorityElement_第2张图片
力扣刷题(十二)--求众数--python语言描述--majorityElement_第3张图片

class Solution:
    def majorityElement(self, nums):
        counts = collections.Counter(nums)
        return max(counts.keys(), key=counts.get)

力扣刷题(十二)--求众数--python语言描述--majorityElement_第4张图片
注意:

  • collections.Counter是python中用来计数的类,隶属于dict,是dict的子类。返回值是字典,因此除了自己的方法以外还共享字典的方法
  • 详细的API请阅读:https://docs.python.org/zh-cn/3/library/collections.html
  • 或者:https://blog.51cto.com/11026142/1851791
  • **调用函数:**不带括号时,调用的是这个函数本身 ,是整个函数体,是一个函数对象,不须等该函数执行完成。带括号(参数或者无参),调用的是函数的执行结果,须等该函数执行完成的结果
def  bracket(data):
    return data
 
if __name__ == '__main__':
 
    # 不带括号调用的结果:, a是整个函数体,是一个函数对象,不须等该函数执行完成
 
    a = bracket
    print a
 
    # 带括号调用的结果:6, b是函数执行后返回的值6, 须等该函数执行完成的结果
 
    b = bracket(6)
    print b

力扣刷题(十二)--求众数--python语言描述--majorityElement_第5张图片

import random

class Solution:
    def majorityElement(self, nums):
        majority_count = len(nums)//2
        while True:
            candidate = random.choice(nums)   #注意random.choice用法
            #choice() 方法返回一个列表,元组或字符串的随机项
            
            if sum(1 for elem in nums if elem == candidate) > majority_count:
                return candidate

力扣刷题(十二)--求众数--python语言描述--majorityElement_第6张图片
力扣刷题(十二)--求众数--python语言描述--majorityElement_第7张图片

class Solution:
    def majorityElement(self, nums):
        count = 0
        candidate = None

        for num in nums:
            if count == 0:
                candidate = num
            count += (1 if num == candidate else -1)

        return candidate

力扣刷题(十二)--求众数--python语言描述--majorityElement_第8张图片

你可能感兴趣的:(算法刷题,编程)