LeetCode题目之腾讯精选练习(50题):求众数

系统管理员 2024-04-18 15:04 175阅读 0赞

题目

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

你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1 :

  1. 输入: [3,2,3]
  2. 输出: 3

示例 2 :

  1. 输入: [2,2,1,1,1,2,2]
  2. 输出: 2

实现代码

  1. public int MajorityElement(int[] nums)
  2. {
  3. Array.Sort(nums);//排序
  4. int i = 0;//记录元素的位置
  5. int n = 0;//记录元素的出现次数
  6. while (n <= nums.Length / 2)
  7. {
  8. n = 1;
  9. for (; i < nums.Length && nums[i] == nums[i + 1]; i++)
  10. {
  11. n++;
  12. }
  13. i++;
  14. }
  15. return nums[i - 1];
  16. }

执行结果

执行结果:通过
执行用时 : 172 ms, 在所有 C# 提交中击败了81.46%的用户
内存消耗 : 28.6 MB, 在所有 C# 提交中击败了5.06%的用户
在这里插入图片描述

小的总结

首先想到的是排序,然后进行统计。后来看官方题解,觉得Boyer-Moore 投票算法很厉害,先按照这种想法自己设计了算法,还是比官方复杂。

Boyer-Moore 投票算法

自己的算法

  1. public int MajorityElement(int[] nums)
  2. {
  3. int i = 1; //记录元素位置
  4. int sum = 1;//计数器
  5. int houxuan = nums[0];//候选数字
  6. while (i < nums.Length)
  7. {
  8. if (nums[i] != houxuan)
  9. sum--;
  10. else
  11. sum++;
  12. if (sum == 0)
  13. {
  14. houxuan = nums[++i];
  15. sum = 1;
  16. }
  17. i++;
  18. }
  19. return houxuan;
  20. }

在这里插入图片描述
官方题解

  1. public int MajorityElement(int[] nums)
  2. {
  3. int count = 0;
  4. int candidate = 0;
  5. foreach (var num in nums)
  6. {
  7. if (count == 0)
  8. {
  9. candidate = num;
  10. }
  11. count += (num == candidate) ? 1 : -1;
  12. }
  13. return candidate;
  14. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,175人围观)

还没有评论,来说两句吧...

相关阅读