zoukankan      html  css  js  c++  java
  • 刷题-力扣-面试题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;
            }
        }
    };
    
  • 相关阅读:
    SQLServer多表联查,多表分页查询
    GOF23种设计模式概括
    常用的正则表达式
    面向对象七大原则
    Jquery简单学习
    MVC图片上传详解
    面向对象OOP概念描述
    C++ 基础命名空间 using namespace std;
    找不到WJSWDLL.dll
    AspectJ中的类型间声明(成员注入)
  • 原文地址:https://www.cnblogs.com/HanYG/p/14494549.html
Copyright © 2011-2022 走看看