zoukankan      html  css  js  c++  java
  • 面试题 17.10. 主要元素 力扣(简单但不简单) 空间复杂度O(1)

    题目描述:

    数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。

    示例 1:

    输入:[1,2,5,9,5,9,5,5,5]
    输出:5

    题源:https://leetcode-cn.com/problems/find-majority-element-lcci/

    代码:该方法利用Hash,时间复杂度O(N),但是空间复杂度也达到了O(N),不满足

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
        int l=nums.size();
        int res=-1;
        map<int ,int>  mp;
        for(int i=0;i<l;i++)
        {
           mp[nums[i]]++;
           if (mp[nums[i]]>l/2) {res=nums[i];  break;}
        }
            return res;
        }
    };

    法二:要求空间是O(1)

    所以只有下面这种方法是可行的:

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
        /*  // Hash方法
        int l=nums.size();
        int res=-1;
        map<int ,int>  mp;
        for(int i=0;i<l;i++)
        {
           mp[nums[i]]++;
           if (mp[nums[i]]>l/2) {res=nums[i];  break;}
        }
            return res;
        */
        // 法二,通过题解,投票机制
        int l=nums.size();
        int count=0;  //  对num为众数的投票,如果num众数,则赞成>反对,即count>0
        int num=0;  // 假设现在众数为num
        for(int i=0;i<l;i++)
        {
            if(count==0) {num=nums[i]; count=1; continue;}
            if(nums[i]==num) count++;
               else count--;
        }
        count=0;
        for(int i=0;i<l;i++)
            if(nums[i]==num) count++;
        if (count>l/2) return num;
            else return -1;
            
        }
    };
  • 相关阅读:
    verilog中的function用法与例子
    HDMI IP学习笔记
    include使用中注意的问题
    PCIE学习
    HDMI学习
    (转)modelsim10.0C编译ISE14.7的xilinx库(xilinx ip核)
    2014年七月华为校招机试题目--最难的一道, 呵呵!
    欧拉函数
    素数高效率筛选法
    树-二叉树的编号
  • 原文地址:https://www.cnblogs.com/stepping/p/14992521.html
Copyright © 2011-2022 走看看