C# 多数元素

169 多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:nums = [3,2,3]
输出:3
示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/majority-element

解决方案:

提供思路

1)最直观的解法是统计数组中每个元素的出现次数,然后寻找出现次数大于 [n/2] 的元素。

遍历数组,使用哈希表记录每个元素的出现次数,遍历结束之后即可得到数组中每个元素的出现次数。然后遍历哈希表,对于哈希表中的每个元素得到出现次数,返回出现次数大于 [n/2] 的元素。

2)另一个解法是将数组排序后得到多数元素。排序后的数组满足相等的元素一定出现在数组中的相邻位置,由于多数元素在数组中的出现次数大于 [n/2],因此排序后的数组中存在至少 [n/2]+1 个连续的元素都是多数元素,下标 [n/2]的元素一定是多数元素。理由如下:

如果多数元素是数组中的最小元素,则排序后的数组从下标 0 到下标 [n/2] 的元素都是多数元素;

如果多数元素是数组中的最大元素,则排序后的数组从下标 [n/2]到下标 n-1的元素都是多数元素;

如果多数元素不是数组中的最小元素和最大元素,则排序后的数组的下标 0 和下标 n−1 的元素都不是多数元素,多数元素的开始下标一定小于 [n/2],结束下标一定大于 [n/2],下标 [n/2] 的元素一定是多数元素。

因此将数组排序之后返回下标 [n/2]的元素即可。

3)寻找多数元素的另一种解法是摩尔投票算法,其时间复杂度是 O(n),空间复杂度是 O(1)。

摩尔投票算法由 Robert S. Boyer 和 J Strother Moore 提出,该算法的基本思想是:在每一轮投票过程中,从数组中删除两个不同的元素,直到投票过程无法继续,此时数组为空或者数组中剩下的元素都相等。

推荐第二种。

上代码:

//1
public class Solution
{
    
    
    public int MajorityElement(int[] nums)
    {
    
    
        IDictionary<int, int> counts = new Dictionary<int, int>();
        foreach (int num in nums)
        {
    
    
            counts.TryAdd(num, 0);
            counts[num]++;
        }
        int majority = 0;
        int n = nums.Length;
        foreach (KeyValuePair<int, int> pair in counts)
        {
    
    
            if (pair.Value > n / 2)
            {
    
    
                majority = pair.Key;
                break;
            }
        }
        return majority;
    }
}

//2
public class Solution
{
    
    
    public int MajorityElement(int[] nums)
    {
    
    
        Array.Sort(nums);
        int n = nums.Length;
        return nums[n / 2];
    }
}

//3
public class Solution
{
    
    
    public int MajorityElement(int[] nums)
    {
    
    
        int majority = nums[0];
        int count = 1;
        int n = nums.Length;
        for (int i = 1; i < n; i++)
        {
    
    
            int num = nums[i];
            if (count == 0)
            {
    
    
                majority = num;
            }
            if (num == majority)
            {
    
    
                count++;
            }
            else
            {
    
    
                count--;
            }
        }
        return majority;
    }
}

以上是碰到的第一百六十九题,后续持续更新。感觉对你有帮助的小伙伴可以帮忙点个赞噢!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Blossom_fall/article/details/131461921