题目大意:
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3] 输出: 3
示例 2:
输入: [2,2,1,1,1,2,2] 输出: 2
解法1:
from collections import Counter
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
tmp = Counter(nums).most_common() # 利用Counter统计出现次数
for i in range(len(tmp)):
if tmp[i][1] > len(nums) / 2: # 谁满足大于n/2就返回谁,题目已经说非空切一定存在众数,所以不做其他情况的讨论了。
return tmp[i][0]
解法2:
众数是指在数组中出现次数大于⌊ n/2 ⌋
的元素。那么问题就很容易了,我们可以先将nums
排序,然后返回中间元素的值即可(众数的个数大于一半,排好序的nums
中间元素一定是众数)
class Solution:
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums.sort()
return nums[len(nums)//2]
在pyhon3中/ 是真除法: 3/2=1.5
地板除是//,是取整数位: 3//2=1
% 表示求余数: 5%2=1
以下是Java版本:
题目大意:给定一个数组,找这个数组中的主元素,主元素是元素出现次数大于⌊ n/2 ⌋的元素。 假设给定的数组非空,主元素都存在。
解题思路: 用一个标记cnt记录某个元素出现的次数,如果后面的元素和它相同就加一,有一个元素和他不相同就减一,当cnt小于等于0时重新记录新的元素。
分析如下:
从头到尾扫描一遍数组,记录当前的majority element的count。
1. public class Solution {
2. public int majorityElement(int[] num) {
3. if(num.length < 3) return num[0];
4. int majority = num[0]; // 用于记录主元素,假设第一个是主元素
5. int count = 1; // 用于抵消数的个数
6. //1,1,1,1,2,1,3,1,2,2,2,2,2,2,
7. for (int i = 1; i < num.length; ++i) { // 从第二个元素开始到最后一个元素
8. if (count == 0) { // 如果两个数相同就不能抵消
9. majority = num[i]; // 记录最后不可以抵消的数
10. ++count;
11. } else if (num[i] == majority) {
12. ++count;
13. } else {
14. --count;
15. }
16. }
17. return majority;
18. }
19. }