力扣算法:多数元素

力扣算法:多数元素

  • 一、多数元素
    • 1、问题
    • 3、思路
    • 4、代码
    • 5、时间与空间复杂度
  • 备注

一、多数元素

1、问题

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

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

示例 1:

输入:[3,2,3]
输出:3

示例 2

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

进阶
尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

3、思路

思路一:
题目中描述----多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素(那么 n//2 位置的元素一定为 “多数元素”)。

  1. 将数组排序。
  2. 返回数组中 n//2 位置的元素。

思路二:

  1. 统计数组中每个元素出现的个数。
  2. 返回出现个数最多的元素。

字典搭配 max() 函数用法:
1、max() 函数中没有 key 参数时,取最大值的依据为 “字典中的索引(key值)”
2、max() 函数中有 key 参数时,取最大值的依据为key中指定的。
#字典中的 get 函数,即通过 get 函数得到 value 值
#key 中的函数可以自己定义

例:
力扣算法:多数元素_第1张图片

思路三:
力扣算法:多数元素_第2张图片
题目中我们需要查找的数字超过数组长度的一半,也就是说,要查找的数字target的个数会超过其他数字个数。

假设不同数字相互抵消,那么最后剩下的数字,就是我们要找的多数元素。

因此我们可以假设数组的第一个数字为target,然后遍历数组,我们尝试用计数cnt模拟这个抵消的过程,规则如下:

  1. 当数组中的元素与假设的target不相等时,计数count减1,即模拟不同数字相互抵消。
  2. 假设数组中的元素与假设的target相等时,计数count加1。
  3. 当计数cnt等于0时,说明在当前遍历到的数组元素中,当前假设的target与其他数字相互抵消(个数相同),所以我们重新假设下一个遍历的数组元素为target,继续上面过程。
  4. 当遍历完数组后,target为所求数字。

4、代码

#coding:utf-8
from typing import List
import collections
class Solution:
    #思路一
    def majorityElement1(self, nums: List[int]) -> int:
        nums.sort()
        return nums[len(nums)//2]
    #思路二
    def majorityElement2(self, nums2: List[int]) -> int:
        counts = collections.Counter(nums2)
        return max(counts,key= counts.get)

    #思路三
    def majorityElement3(self, nums3: List[int]) -> int:
        target = nums3[0]
        count = 0
        for i in nums3:
            if i == target:
                count += 1
            else:
                count -= 1
            if count == -1:
                target = i
                count = 0
        return target


if __name__ == "__main__":
    nums = [2,2,1,1,1,2,2]
    # nums = [3,2,3]
    # nums = [1]

    print(Solution().majorityElement1(nums))
    print(Solution().majorityElement2(nums))
    print(Solution().majorityElement3(nums))

5、时间与空间复杂度

思路一:
时间复杂度:O(n),n为数组的长度
空间复杂度:O(n),建立哈希表所用空间

思路二:
时间复杂度:O(nlogn),排序的时间复杂度
空间复杂度:O(logn),语言自带的排序算法使用的栈空间

思路三:
时间复杂度:O(n),n为数组的长度
空间复杂度:O(1)

备注

1、思路三转载:
belinda
https://leetcode-cn.com/problems/majority-element/solution/mo-er-tou-piao-fa-de-xing-xiang-jie-shi-03y9s/

你可能感兴趣的:(力扣算法,python,leetcode)