题目描述
简单616收藏分享切换为英文关注反馈给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [3,2,3] 输出: 3
示例 2:
输入: [2,2,1,1,1,2,2] 输出: 2
思路
符合直觉的做法是利用额外的空间去记录每个元素出现的次数,并用一个单独的变量记录当前出现次数最多的元素。
但是这种做法空间复杂度较高,有没有可能进行优化呢? 答案就是用"投票算法"。
投票算法的原理是通过不断消除不同元素直到没有不同元素,剩下的元素就是我们要找的元素。
python
计数法
复杂度分析
- 时间复杂度:O(N),其中N为数组长度
- 空间复杂度:O(N)
class Solution:
def majorityElement(self, nums: List[int]) -> int:
tmap = {}
for i in nums:
if i not in tmap:
tmap[i] = 1
elif i in tmap:
tmap[i] += 1
return sorted(tmap.items(), key=lambda item:item[1], reverse=True)[0][0]
投票法
复杂度分析
- 时间复杂度:O(N),其中N为数组长度
- 空间复杂度:O(1)
class Solution:
def majorityElement(self, nums: List[int]) -> int:
count, maxnum = 1, nums[0]
for i in nums[1:]:
if count == 0:
maxnum = i
if i == maxnum:
count += 1
else :
count -= 1
return maxnum
C++
class Solution {
public:
int majorityElement(vector<int>& nums) {
int count = 0;
int maxnum = nums[0];
for(auto i : nums){
if(count == 0) maxnum = i;
if(i == maxnum) count++;
else count--;
}
return maxnum;
}
};