zoukankan      html  css  js  c++  java
  • leetcode 169. Majority Element 、229. Majority Element II

    169. Majority Element

    求超过数组个数一半的数

    可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n)

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            unordered_map<int,int>  count;
            int n=nums.size();
            for(int i=0;i<n;i++){
                if(++count[nums[i]]>n/2) return nums[i];
            }
            return 0;
        }
    };

    使用投票法,时间复杂度为O(n),空间复杂度为O(1)。

    投票法就是记录出现的频次

    leetcode是默认了有超过的,所以可以直接这样返回。像剑指offer上,还要用这个数去累加计算看是否真的超过了n/2。

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            int freq = 0;
            int res;
            for(int i = 0;i < nums.size();i++){
                if(freq == 0){
                    res = nums[i];
                    freq++;
                }
                else if(nums[i] == res)
                    freq++;
                else
                    freq--;
            }
            return res;
        }
    };

    229. Majority Element II

    求个数超过n/3的数

    首先明确最多只有可能有2个数超过,如果有3个数都超过了,那数组的个数肯定大于n了。

    还是使用投票法。

    错误写法:这个写法先去考虑了freq1、2,实际上应该首先考虑是否和当前数字相当,如果不相等再去考虑freq的问题

    Input:
    [1,2,2,3,2,1,1,3]
    Output:
    [1]
    Expected:
    [2,1]

    class Solution {
    public:
        vector<int> majorityElement(vector<int>& nums) {
            vector<int> result;
            int num1,num2,freq1 = 0,freq2 = 0;
            for(int i = 0;i < nums.size();i++){
                if(freq1 == 0){
                    num1 = nums[i];
                    freq1++;
                }
                else if(nums[i] == num1)
                    freq1++;
                else if(freq2 == 0){
                    num2 = nums[i];
                    freq2++;
                }
                else if(nums[i] == num2)
                    freq2++;
                else{
                    freq1--;
                    freq2--;
                }
            }
            freq1 = 0,freq2 = 0;
            for(int i = 0;i < nums.size();i++){
                if(nums[i] == num1)
                    freq1++;
                if(nums[i] == num2)
                    freq2++;
            }
            if(freq1 > nums.size()/3)
                result.push_back(num1);
            if(freq2 > nums.size()/3 && num1 != num2)
                result.push_back(num2);
            return result;
        }
    };

    正确写法:

    class Solution {
    public:
        vector<int> majorityElement(vector<int>& nums) {
            vector<int> result;
            int num1 = 0,num2 = 0,freq1 = 0,freq2 = 0;
            for(int i = 0;i < nums.size();i++){
                if(nums[i] == num1)
                    freq1++;
                else if(nums[i] == num2)
                    freq2++;
                else if(freq1 == 0){
                    num1 = nums[i];
                    freq1++;
                }
                else if(freq2 == 0){
                    num2 = nums[i];
                    freq2++;
                }
                else{
                    freq1--;
                    freq2--;
                }
            }
            freq1 = 0,freq2 = 0;
            for(int i = 0;i < nums.size();i++){
                if(nums[i] == num1)
                    freq1++;
                else if(nums[i] == num2)
                    freq2++;
            }
            if(freq1 > nums.size()/3)
                result.push_back(num1);
            if(freq2 > nums.size()/3)
                result.push_back(num2);
            return result;
        }
    };
  • 相关阅读:
    <经验杂谈>C#/.Net中xml的Serialization序列化与DeSerializetion反序列化
    <经验杂谈>C#中一种最简单、最基本的反射(Reflection):通过反射获取方法函数
    应用highcharts做直观数据统计
    ASP.net获取当前页面的文件名,参数,域名等方法
    C#中唯一标识符GUID的一些知识点
    理清fineuploader无刷新上传的一些事
    webform开发经验(一):Asp.Net获取Checkbox选中的值
    C#/.Net Post获取数据流的一种简单写法
    C#中的一种按日期分文件夹的日志写法
    C# Datatable导出Excel方法
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10756888.html
Copyright © 2011-2022 走看看