求众数

题目描述:

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

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

示例 1:

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

示例 2:

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

解法一:

众数是出现次数大于n/2的元素,如果对数组进行排序,直接返回位于n/2位置处的元素即为众数;

采用快速排序的时间复杂度是O(Nlog(N)),查找众数的时间复杂度是O(1),所以最终时间复杂度是O(NlogN),代码如下:

class Solution {public int majorityElement(int[] nums) {Arrays.sort(nums);return nums[nums.length/2];    }
}

解法二:

我们使用哈希表来存储每个元素,然后用一个循环在线性时间内遍历 nums ,然后我们只需要返回有最大值的键。

class Solution {public int majorityElement(int[] nums) {Map<Integer,Integer> map = countNums(nums);Map.Entry<Integer,Integer> majorityEntry = null;for(Map.Entry<Integer,Integer> entry:map.entrySet()){if(majorityEntry==null||entry.getValue()>majorityEntry.getValue()){majorityEntry = entry;}}return majorityEntry.getKey();}private Map<Integer,Integer> countNums(int[] nums){Map<Integer,Integer> map = new HashMap<Integer,Integer>();for(int num:nums){if(!map.containsKey(num))map.put(num,1);else{map.put(num,map.get(num)+1);}}return map;}
}

解法三:

这里我们使用经典的分治算法递归求解,直到所有的子问题都是长度为 1 的数组。由于传输子数组需要额外的时间和空间,所以我们实际上只传输子区间的左右指针 lo 和 hi 表示相应区间的左右下标。长度为 1 的子数组中唯一的数显然是众数,直接返回即可。如果回溯后某区间的长度大于 1 ,我们必须将左右子区间的值合并。如果它们的众数相同,那么显然这一段区间的众数是它们相同的值。否则,我们需要比较两个众数在整个区间内出现的次数来决定该区间的众数。原问题的答案就是下标为 00 和 nn 之间的众数这一子问题。

class Solution {private int countInRange(int[] nums, int num, int lo, int hi) {int count = 0;for (int i = lo; i <= hi; i++) {if (nums[i] == num) {count++;}}return count;}private int majorityEleme***ec(int[] nums, int lo, int hi) {// base case; the only element in an array of size 1 is the majority// element.if (lo == hi) {return nums[lo];}// recurse on left and right halves of this slice.int mid = (hi-lo)/2 + lo;int left = majorityEleme***ec(nums, lo, mid);int right = majorityEleme***ec(nums, mid+1, hi);// if the two halves agree on the majority element, return it.if (left == right) {return left;}// otherwise, count each element and return the "winner".int leftCount = countInRange(nums, left, lo, hi);int rightCount = countInRange(nums, right, lo, hi);return leftCount > rightCount ? left : right;}public int majorityElement(int[] nums) {return majorityEleme***ec(nums, 0, nums.length-1);}
}

LeetCode—求众数相关推荐

  1. leetcode:求众数

    leetcode:求众数 题目描述:给定一个大小为n的数组,找到其中的众数.众数是指在数组中出现次数大于⌊ n/2 ⌋(下取整)的元素. 你可以假设数组非空,并且给定数组总是存在众数 例子:数组[3, ...

  2. leetcode求众数

    哈希法 class Solution:def majorityElement(self, nums: List[int]) -> int:# 时间复杂度o(n)# 空间复杂度O(n)dict_n ...

  3. Leetcode 求众数

    给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] 输出: 3 ...

  4. LeetCode求众数C++版

    题目描述: 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] ...

  5. LeetCode 169. 求众数(摩尔投票)

    文章目录 1. 题目信息 2. 解题思路 3. 代码 3.1 排序 3.2 map计数 3.3 摩尔投票 1. 题目信息 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ ...

  6. Leetcode:169. 求众数

    题目链接 求众数 题目描述 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: ...

  7. leetcode【简单】169、多数元素 / 229、求众数2

    169.多数元素 给定一个大小为 n 的数组,找到其中的多数元素.多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 尝试设计时间复杂 ...

  8. java求众数_Java实现 LeetCode 229 求众数 II(二)

    229. 求众数 II 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1). 示例 1: 输入: [3,2, ...

  9. 独乐乐不如众乐乐,如何装逼的求众数

    点击蓝色"五分钟学算法"关注我哟 加个"星标",一起学算法 今天分享的题目来源于 LeetCode 上第 169 号问题:求众数(求数组中超过一半的数字).题目 ...

最新文章

  1. Mac OS X 下查看和设置JAVA_HOME
  2. python语句-浅谈 Python 的 with 语句
  3. mysql索引的类型和查看、添加、修改、删除索引的方法介绍
  4. MapReduce InputFormat之FileInputFormat
  5. Linux手动指定ip地址
  6. 拼多多否认损失 200 亿;董明珠回应再拼三年;特斯拉称“未来艰难” | 极客头条...
  7. ac3168无线网卡驱动下载_REALTEK芯片无线网卡最新驱动!支持到10.15
  8. 简易交通灯设计——数电课设
  9. js 时间转换、 向上保留两位小数
  10. 如何通过看原版电影学英语
  11. 设置代理服务器(谷歌+IE)
  12. PAT甲级 1116
  13. 营业执照统一社会信用代码Java正则表达式
  14. endl 和 \n 的区别
  15. 如何搭建企业数据化运营体系?
  16. Virtualbox如何配置Linux的网络连接
  17. 10个顶尖响应式HTML5网页
  18. (转载)【笨木头Lua专栏】基础补充07:协同程序初探
  19. 可编程逻辑器件与专用集成电路——《Verilog 与数字ASIC设计基础》读书笔记
  20. c语言开发五轴后处理,「数控干货」基于UG CLS文件使用 C 语言制作智能后处理工具...

热门文章

  1. 元学习(Meta-learning)简介
  2. 用gcc生成静态库和动态库.pdf以及opencv的使用
  3. ArcSDE配置与使用
  4. 分享一个http请求工具类,超好用。
  5. 班组安全活动如何管理
  6. vivo手机支持java功能_vivo手机有哪些功能 vivo手机实用功能介绍【详解】
  7. Docker上配置Redis集群时出现No more cluster attempts left.
  8. php fetchall 游标,MySQLdb fetchall返回字典的方法
  9. USB通讯基于FPGA的CY7C68013A实现(1)
  10. Spring Webflux - 03 Webflux编程模型