输出多数元素

  • 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
  • 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        // 先排序
        int ans;
        int len = nums.size();
        sort(nums.begin(), nums.end());
        ans = nums[len / 2];
        return ans;
    }
};
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int count = 1;
        int maj = nums[0];
        for(int i = 1; i < nums.size(); ++i){
            if(maj == nums[i]){
                count++;
            }
            else{
                count--;
                if(count == 0){
                    maj = nums[i + 1];
                }
            }
        }
        return maj;
    }
};

这段代码是一个 C++ 类 Solution 的定义,其中包含了一个名为 majorityElement 的成员函数,用于找出输入数组 nums 中的主要元素。

主要元素是指在数组中出现次数超过数组长度一半的元素。这段代码使用了一种称为摩尔投票算法(Moore’s Voting Algorithm)的方法来实现在线性时间复杂度 O(N) 和常量空间复杂度下找出主要元素。

以下是对这段代码的解释:

  1. 首先,定义了一个变量 count 并初始化为 1,用于记录当前候选主要元素的出现次数。
  2. 定义了一个变量 maj 并初始化为数组 nums 的第一个元素,作为候选主要元素。
  3. 遍历数组 nums,从第二个元素开始,通过 for 循环。
  4. 在循环中,判断当前元素 nums[i] 是否与候选主要元素 maj 相等。
    • 若相等,将 count 自增 1,表示当前元素的出现次数增加了。
    • 若不相等,将 count 自减 1,表示当前元素的出现次数减少了。
  5. 接着判断 count 是否等于 0,若等于 0,则说明候选主要元素 maj 的出现次数已经被抵消掉,需要重新选择候选主要元素。
  6. maj 更新为下一个元素 nums[i + 1],作为新的候选主要元素。
  7. 最后,遍历完成后,maj 就是找到的主要元素,直接返回即可。

需要注意的是,这段代码假定输入数组 nums 中一定存在主要元素,并且不会出现多个主要元素的情况。如果输入数组不满足这些条件,代码可能会返回错误的结果。在实际使用时,需要根据具体情况进行验证和处理。

在这段代码中,maj 在更新时使用了 nums[i + 1] 而不是 nums[i],是因为在更新 maj 时,需要保证新的候选主要元素 maj 在当前位置 i 之后的元素中出现的次数比在当前位置 i 之前的元素中出现的次数多。

这是因为在这段代码中,使用了 count 变量来记录当前候选主要元素的出现次数,而每次遇到不相等的元素时,会将 count 自减 1。如果在更新 maj 时选择了 nums[i],则当前位置 i 之后的元素与当前位置 i 之前的元素的出现次数是相等的,因为 count 被减为 0 时才会更新 maj

而选择 nums[i + 1] 作为新的候选主要元素,可以确保新的候选主要元素在当前位置 i 之后的元素中出现的次数至少比在当前位置 i 之前的元素中出现的次数多 1。这样,在后续的遍历中,即使 count 在之后的元素中被减为 0,也能保证新的候选主要元素仍然有出现次数超过一半的机会。

这种更新策略保证了摩尔投票算法的正确性,能够正确找出输入数组中的主要元素。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值