刷题-力扣-面试题17.10. 主要元素
面试题 17.10. 主要元素
题目链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-majority-element-lcci/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目描述
数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。
示例 1:
输入:[1,2,5,9,5,9,5,5,5]
输出:5
示例 2:
输入:[3,2]
输出:-1
示例 3:
输入:[2,2,1,1,1,2,2]
输出:2
说明:
- 你有办法在时间复杂度为 O(N),空间复杂度为 O(1) 内完成吗?
题目分析
- 根据题目描述返回数组中超过一半的数
- 使用摩尔投票法,中心思想是删除数组中不相同的两个数,剩下的数就是主要元素
- x从第一个数开始遍历数组,设置计数器n为1,当遇到与x相同的数计数器加一,否则计数器减一。当计数器n等于0时,x等于当前的数,计数器设为1
- 反复执行上述步骤(步骤3),直到达到数组末尾
- 循环结束,当n==0,主要元素不存在返回-1,当n>0,验证n是否为主要元素,是返回x,否则返回-1
代码
class Solution {
public:
int majorityElement(vector<int>& nums) {
int x = 0;
int n = 0;
for (int i = 0; i < nums.size(); i++) {
if (n < 1) {
x = nums[i];
n = 1;
} else {
if (x == nums[i]) n++;
else n--;
}
}
if (n == 0) return -1;
else {
int sum = 0;
for (int num : nums) {
if (x == num) sum++;
}
if (sum > nums.size() / 2) return x;
else return -1;
}
}
};