算法入门-多数元素

因为学校老师布置的人物所以学习算法搁置了一段时间,今天写了一道比较简单的题目,下面是题目和链接:

题目:给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:
输入:nums = [3,2,3]
输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2
来源:力扣(LeetCode)
链接: https://leetcode.cn/problems/majority-element

我的思路:

  1. 先用快排给数组排个序,方便之后记数;

  1. 如果数组长度为1直接返回;

  1. 倒序开始计算数组元素出现次数(采用倒序是因为为了避免数组越界访问的问题),每个数组只有一个多数元素,所以如果计数变量超过数组长度1/2就可以返回啦,否则继续,统计完一个数组元素出现次数后,统计下一个时要将记数变量归1,下面是具体代码;

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int a=1,len = nums.size();
        if(len==1){
            return nums[0];
        }
        for(int i=len-1;i!=0;i--){
            if(nums[i]==nums[i-1]){
                a++;
            }else if(nums[i]!=nums[i-1]){
                a=1;
            }
            if(a>nums.size()/2){
                return nums[i];
            }
        }
        return -1;
    }
};

我的思路2.0:写完习惯逛评论区,看到了很多不同的解法(位运算、直接调用api、哈希数组),最感兴趣的还是摩尔投票法,如果议员参选,信仰a的民众超过投票总数的一半,假设投的票可以相互抵消,投a一票抵消投其他人的一票,那么最后因为人数优势,a会当选。

所以我在原本的代码上根据这个想法小修了一下,我假设每个元素的需要次数就是数组长度的一半,然后如果遇到相同的元素那就-1,当记数变量为0时返回,否则继续,下面时代码实现:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int a=nums.size()/2,len = nums.size();
        if(len==1){
            return nums[0];
        }
        for(int i=len-1;i!=0;i--){
            if(nums[i]==nums[i-1]){
                a--;
            }else if(nums[i]!=nums[i-1]){
                a=nums.size()/2;
            }
            if(a<=0){
                return nums[i];
            }
        }
        return -1;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值