Majority Element(算法分析week2)

本文介绍了一种高效的算法来找出数组中的多数元素,即出现次数超过数组长度一半的元素。通过遍历数组并使用计数的方式,即使在有限的时间和空间复杂度下也能找到答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Majority Element

题目来源:https://leetcode.com/problemset/algorithms/

  • 问题描述
  • 解题思路
  • 代码实现

问题描述

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.
You may assume that the array is non-empty and the majority element always exist in the array.
Credits:
Special thanks to @ts for adding this problem and creating all test cases.

解题思路

第一个思路

看到这道题的第一个想法就是排序,但是想到排序可能会超过时间限制,并没有采用这个方案。

第二个思路

是动态分配一个数组sum并初始化为0,遍历整个已知数据的数组nums,且sum[nums[i]]++,当sum[nums[i]] > n/2时,majority element就是nums[i]。但我忽略了nums[i]的数据可以很大,这样就没有办法确定动态分配的数组的大小,所以这个思路也是不可行的。

第三个思路

majority element的数量一定比非majority element的数字的数目多。
(1)那么假定第一个数字是majority element,并设置变量sum为0。
(2)遍历数组nums,如果sum为0,则设置majority为num[i],sum++。
否则,如果nums[i]等于majority element,sum++;
如果nums[i]不等于majority element,sum–。
(3)若所假定为majority element就是真正的majority element, 则sum–时就相当于用一个majority element抵消了一个非majority element,sum == 0时,剩余的数字中仍是majority element的数目多于非majority element。
(4)若所假定的majority element并非真正的majority element。则当sum==0时,剩余的数字也一定是majority element的数目多于非majority element。
(4)那么最后遍历完数组时,此时majority element的值一定是真正的majority element。

代码实现

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int sum = 0;
        int majority;
        vector<int>::iterator it;
        vector<int>::iterator it1;
        for (it = nums.begin(); it != nums.end(); it++) {
            if (it == nums.begin()) {
                majority = *it;
                sum++;
            } else {
                if (sum == 0) {
                    sum++;
                    majority = *it;
                } else {
                    if (*it == majority) sum++;
                    else sum--;
                }
            }
        }
        return majority;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值