Leetcode Algorithms - Divide and Conquer:169. Majority Element

Description

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.

分析

由于该元素出现次数超过了n/2次。所以很自然地想到进行排序后,中间的数就是该元素。代码如下:

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

如果使用分治法的思想,可以将区间一分为二,对左右两边都寻找出现次数最多的元素。即使某一边的majority element不是正确的解,但是由于这个元素在整个区间出现的次数超过了n/2次,所以另外一边的majority element一定是正确的解。
最后需要从左右两边的majority element中选出正确的解。想了很久没有什么很好的办法,最后决定使用遍历计数的方法,求出这两个数在左右区间出现的总次数,选出出现最多的数即可。
代码如下:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        return majorityElementInRange(nums, 0, nums.size() - 1);
    }
private:
    int majorityElementInRange(vector<int>& nums, int from, int to) {
        if (from == to)
            return nums[from];
        int mid = from + (to - from) / 2;
        int left = majorityElementInRange(nums, from, mid);
        int right = majorityElementInRange(nums, mid + 1, to);
        int leftCount = countInRange(nums, left, from, to);
        int rightCount = countInRange(nums, right, from, to);
        return leftCount >= rightCount ? left : right;
    }

    int countInRange(vector<int>& nums, int search, int from, int to) {
        int count = 0;
        for (int i = from; i <= to; i++)
            if (nums[i] == search)
                count++;
        return count;
    }
};

代码中使用mid = low + (high - low) / 2而不使用mid = (low + high) / 2的原因是后者可能会出现整数溢出的问题。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值