Majority Element [LeetCode 169]

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.

Analysis


最简单的方法就是计算每个数出现的次数,当统计到一个数出现的次数大于n/2,那么就输出这个数。时间复杂度为O(n)。

但由于我是选择的是Divide and Conquer这个topic,所以我尝试用分治的思想解决这个问题。

分治法的思想:

  • 将大的问题分解为小的子问题,但子问题和大问题本质上为同一问题。
  • 递归解决这些子问题。
  • 将子问题的解答合并获得大问题的解答。

假设输入的是一个长度为n的vector,我们可以从中间把它分成两半,分别求出它们中出现次数最多的数。这两半也可以继续分解,分解到仅剩下一个数时停止。这就是一个把大问题分解为小的子问题的过程,我们要做的仍然是求出出现次数最多的数,但由于不断的分解,最后只剩下一个数时,这个数这个子问题中出现次数最多的数了。
这里写图片描述

Answer


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

        //递归解决子问题
        int leftpart = majorpart(nums, left, mid);
        int rightpart = majorpart(nums, mid + 1, right);

        //cout << leftpart << ' ' << rightpart << endl;

        //将子问题的解答合并获得大问题的答案
        if (leftpart == rightpart) return leftpart;
        else {
            int a = count(nums.begin() + left, nums.begin() + right + 1, leftpart);
            int b = count(nums.begin() + left, nums.begin() + right + 1, rightpart);
            return a>b? leftpart:rightpart;
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章