算功@LeetCode:MajorityElement

Log

  • 【170417】完成 01 版提交

题目

Majority Element

【题目类型备注】

数组, 分治法, 位操作

提交

01

【语言】

Python

【时间】

170417

【思路】

既然主元素数量超过一半,那么当数组有序后,该元素在数组中的连续长度必定超过数组总长的 1/2。

因此只要让数组有序,再取下标为 n/2 的元素即可

【代码】

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        arr = sorted(nums)
        return arr[len(nums)/2]

【结果】

运行时:58 ms

报告链接:https://leetcode.com/submissions/detail/100362952/

不知道其他拥有 LeetCode 帐号的人能不能看到该报告,所以顺便附图如下:

算功@LeetCode:MajorityElement_第1张图片
Your runtime beats 87.70% of python submissions.

其实我本来想写分治法的(因为最开始就是通过「分治法」的分类找到这题),但实在想不出来分治法的解法。于是观察到了这个特点。没想到速度还挺快。

00

参考解法:

  • C++
    • 【思路】
      1. 所有元素,要么是主元素,要么不是主元素。
      2. 我们先假设首元素为主元素,此后,遇到旧元素,增加计数,遇到新元素则减少。当减少到 0 时,选取新元素为新的主元素。
      3. 由于主元素占总量超过 1/2,因此无论在什么时候开始遇上主元素,在遍历结束后,主元素的计数都一定是正的(想象:主元素为 +,其他元素为 -,那么数组就是一系列 +- 的交替,而 + 的数量超过符号总量的一半,因此最后剩下的一定是 +,无论 +- 如何分布)
  • C++
    • 该解法中有分治解法,但尚未研究。。。

自己实现一遍最优解:

  • [date-language] 。。。

你可能感兴趣的:(算功@LeetCode:MajorityElement)