[LeetCode] 169. Majority Element(主元素)
-
Difficulty: Easy
-
Related Topics: Array, Divide and Conqur, Bit Manipulation
Description
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋
times.
给一个长度为 n 的数组,找到该数组的主元素。主元素是在数组中出现的次数大于 ⌊ n/2 ⌋
的元素。
You may assume that the array is non-empty and the majority element always exist in the array.
你可以假设数组非空,且主元素一定存在。
Examples
Example 1
Input: [3,2,3]
Output: 3
Example 2
Input: [2,2,1,1,1,2,2]
Output: 2
Solution
这题有个显而易见的做法就是统计每个数字出现的频率,然后找出频率最大的。这需要额外的空间记录这些频率信息。之前有看过另外一种只需要常数额外空间的解法,大致思路如下:
-
准备两个变量,一个记录结果,一个记录该结果对应的频率,初始时,设定第一个元素为结果,频率为 1。(题目假定数组非空,所以可以这么做)
-
遍历之后的元素,元素与结果相同,频率 +1,否则频率 -1。如果频率扣减至 0,则设置当前元素为结果并重置频率。
-
数组遍历完成后,最后的结果即为所求。
代码如下:
class Solution {
fun majorityElement(nums: IntArray): Int {
var result = nums[0]
var count = 1
for (i in 1..nums.lastIndex) {
if (nums[i] == result) {
count++
} else {
count--
}
if (count == 0) {
result = nums[i]
count = 1
}
}
return result
}
}