leetcode169

leetcode169

题目简介

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
示例 1:
输入: [3,2,3]
输出: 3
简单的来说就是给出数组中个数大于n/2的元素

解题思路

我们可以使用排序,将数组中的元素全部排序一遍,因为我们需要的数字个数大于n/2,因此数组中间的那个一定是我们需要的值

AC代码

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        return nums[nums.size()/2];
    }
};

其他题解

另外还有3种解法,分别为哈希法、moore投票、随机数

哈希表解法

在c++11中引入了hash-table,形式为unordered_map,其中的元素存储是无序的,但是你可以通过他们的键值寻找他们
如此题所示,我们如果对于map[n]++,n就是其键值,我们可以将n作为读取nums中的元素,然后在时间复杂度O(n)的情况下就可以得出

//哈希法代码
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        unordered_map <int,int> mp;
        for(int n:nums){
            if(++ mp[n] > nums.size()/2){
                return n;
            }
            cout << mp[n] << endl;
        } 
        return -1;
    }
};

(PS:但是似乎还是比sort的优化做的差,我实践来发现内存相差不大,但是时间要多不少)

moore投票

此方法经过我阅读以后,我认为又是针对于这个元素大于n/2的性质,因为大于一般,所以最终计数的值必定是大于等于1的,然后对应的就是答案的值

class Solution {
public:
    int majorityElement(vector<int>& nums) { 
        int count=0,candidate;
        for(int n:nums)
        {
            if(count==0){
                candidate=n;
            }        
            if(n==candidate)    count++;
            else                count--;
        }
        return candidate;
    }
};

随机数

这个就是凑运气了,每次选取nums中的一个元素,查看他出现他的频率是否大于n/2

class Solution {
public:
    int majorityElement(vector<int>& nums) { 
        while(true)
        {
            int candidate=nums[rand() % nums.size()],count=0;   
            for(int n:nums)
            {
            if(n==candidate)     
                count++;
            }
            if(count > nums.size()/2)           return candidate;
        }
        return -1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值