• 【程序员面试金典】面试题 17.10. 主要元素


    题目

    数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-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) 内完成吗?

    思路

    假设第一个元素为出现次数超过一半元素,遍历后面数,如果等于目标数,次数cnt加一,否则,cnt减一,如果cnt小于0,则重新设置当前数为新的出现次数超过一半的目标数并设置出现次数为1。循环遍历后,如果cnt小于等于0,则不存在。否则,进行验证。

    代码

    时间复杂度:O(n)
    空间复杂度:O(1)

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            int size = nums.size();
            int cnt = 1, target = nums[0];
            for (int i = 1; i < size; ++i) {
                if (nums[i] == target) ++cnt;
                else --cnt;
                if (cnt < 0) {
                    target = nums[i];
                    cnt = 1;
                }
            }
            if (cnt <= 0) return -1;
            cnt = 0;
            for (auto n : nums) {  // 验证
                if (n == target) ++cnt;
            }
            return cnt > size / 2 ? target : -1;
        }
    };
    
  • 相关阅读:
    linux 环境下安装oracle11g方法及安装过程中遇上的问题解决方法
    Opencv Mat的操作
    Opencv 的数据结构
    Opencv 摄像头矫正
    LM算法
    Python 正则表达式
    find grep
    Socket 入门
    Python thread
    Javascript实现页面跳转的几种方式
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/13022219.html
Copyright © 2020-2023  润新知