刷题-力扣-面试题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) 内完成吗?

题目分析

  1. 根据题目描述返回数组中超过一半的数
  2. 使用摩尔投票法,中心思想是删除数组中不相同的两个数,剩下的数就是主要元素
  3. x从第一个数开始遍历数组,设置计数器n为1,当遇到与x相同的数计数器加一,否则计数器减一。当计数器n等于0时,x等于当前的数,计数器设为1
  4. 反复执行上述步骤(步骤3),直到达到数组末尾
  5. 循环结束,当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;
        }
    }
};
posted @ 2021-03-07 14:30  韩亚光  阅读(56)  评论(0编辑  收藏  举报