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 帐号的人能不能看到该报告,所以顺便附图如下:
其实我本来想写分治法的(因为最开始就是通过「分治法」的分类找到这题),但实在想不出来分治法的解法。于是观察到了这个特点。没想到速度还挺快。
00
参考解法:
- C++
- 【思路】
- 所有元素,要么是主元素,要么不是主元素。
- 我们先假设首元素为主元素,此后,遇到旧元素,增加计数,遇到新元素则减少。当减少到 0 时,选取新元素为新的主元素。
- 由于主元素占总量超过 1/2,因此无论在什么时候开始遇上主元素,在遍历结束后,主元素的计数都一定是正的(想象:主元素为
+
,其他元素为-
,那么数组就是一系列+
与-
的交替,而+
的数量超过符号总量的一半,因此最后剩下的一定是+
,无论+
与-
如何分布)
- 【思路】
- C++
- 该解法中有分治解法,但尚未研究。。。
自己实现一遍最优解:
- [date-language] 。。。