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;
}
}
以上是碰到的第一百六十九题,后续持续更新。感觉对你有帮助的小伙伴可以帮忙点个赞噢!