leetcode编程记录3 #169 Majority Element

leetcode编程记录3 #169 Majority Element

标签(空格分隔): leetcode


这次这道题是一道有着多种解法的题目,题目如下:
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 ⌋次的一个主元数,由于题目中所给的数组总是存在这样一个数,所以方法十分多样,因为最近在学习分治的方法,所以我首先采用了分治的思想来解决这道题目。
可以将该问题一分为二来考虑,将给定的数组分成两个大约等长的子数组,那么所要求的主元数一定存在于这两个数组中的一个,并且数量也是在该数组中最多的一个数,所以通过将数组不断的一分为二,最后变为一个时返回该元素本身,最后通过比较两个数组中返回元素的数目大小就能选出数目超过⌊ n/2 ⌋的主元数来,c++代码如下:

    class Solution {
public:
    int majorityElement(vector<int>& nums) {
        return divideAndConquer(nums, 0, nums.size() - 1);
    }
    int divideAndConquer(vector<int>& nums, int i, int j)
    {
        if (j - i == 0)
        {
            return nums[i];
        }

            int a = divideAndConquer(nums, i, i + (j - i) / 2);
            int b = divideAndConquer(nums,  i + (j - i) / 2 + 1, j);
            if(a == b) return a;
            if(count(nums.begin() + i, nums.begin() + j + 1, a) > count(nums.begin() + i, nums.begin() + j + 1 , b))
            {
                return a;
            }
            else
            {
                return b;
            }
    }
};

另一种方法则是扫描一遍数组,记录下来每次不同元素出现的次数,这可以通过构建一个哈希表来完成,代码如下:

class Solution {
public:
    int majorityElement(vector<int>& nums) {

        std::map<int, int> hashTable;
        for (int i = 0; i < nums.size(); i++)
        {
            hashTable[nums[i]]++;
            if (hashTable[nums[i]] > nums.size() / 2)
            {
                return nums[i];
            }
        }        
    }

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode是一个著名的在线编程题库,可以帮助计算机程序员提升编程能力。LeetCode的题目涵盖了算法、数据结构、字符串、数组、链表等多个方面的知识,对于求职面试以及算法竞赛准备非常有帮助。 LeetCode上的编程题目分为简单、中等和困难三个难度级别。每个题目都有详细的题目描述、输入输出示例以及参考答案等内容。在解决每个问题时,我们需要仔细阅读题目,并根据题目要求提供正确的解答。 通常,我们需要使用编程语言如Python、C++等来实现解题思路。在编码之前,我们需要先分析问题,并找到合适的算法或数据结构来解决问题。一般来说,我们可以使用递归、迭代、动态规划等方法来解决常见的编程问题。 在LeetCode上,我们可以提交解答,并测试解答是否通过了所有的测试用例。如果通过了所有的测试用例,我们就可以得到题目的AC(Accepted)结果,并获得该题目的通过证书。如果没有通过所有的测试用例,我们可以检查自己的解答,查找解答中的错误或者不完善之处,并进行修改和优化。 总之,LeetCode编程题是一个优秀的学习和练习编程的平台。通过解答LeetCode上的编程题目,我们可以提升自己的编程能力,并且培养解决问题的思维方式。无论是求职面试还是算法竞赛,LeetCode编程题都是非常有帮助的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值