当前位置: 首页 > news >正文

剑指offer39.数组中出现次数超过一半的数字

这个题非常简单,解法有很多种,我用的是HashMap记录每个元素出现的次数,只要次数大于数组长度的一半就返回。下面是我的代码:

class Solution {public int majorityElement(int[] nums) {int len = nums.length/2;HashMap<Integer,Integer> map = new HashMap<Integer, Integer>();for(int i=0;i<nums.length;i++){int key = nums[i];if(!map.containsKey(key)){map.put(key,1);if(map.get(key) > len) return key;}else{map.put(key,map.get(key)+1);if(map.get(key) > len) return key;}}return -1;}
}

题解还有一种更牛逼的解法,把数组排序,然后返回数组中间的那个数就行,因为如果这个数出现的次数大于数组长度的一半的话,排完序后数组中间那个数一定是它。

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

还有用分治法的,如果一个数是这个数组的总数,那么把这个数组分成两个子数组后,这个数至少是其中一个数组的众数,然后选出两个众数中真正的众数即可。可以采用递归的方法,不断把数组分成两个子数组,直到子数组的长度为1,合并左右两个数组,然后再不断合并,最后就可以找到整个数组的众数了

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 majorityElementRec(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 = majorityElementRec(nums, lo, mid);int right = majorityElementRec(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 majorityElementRec(nums, 0, nums.length - 1);}
}

还有一种Boyer-Moore 投票算法,他是先选一个候选数,先把他的次数定为0,如果下一个数和他一样次数加一,如果不一样次数减一,如果次数为0,侯选数换成下一个数,最后的侯选数就是众数。

class Solution {public int majorityElement(int[] nums) {int count = 0;Integer candidate = null;for (int num : nums) {if (count == 0) {candidate = num;}count += (num == candidate) ? 1 : -1;}return candidate;}
}

http://www.lryc.cn/news/117669.html

相关文章:

  • spring技术栈面试题
  • Android Glide MemorySizeCalculator计算值,Kotlin
  • KEIL自带的Jlink怎么升级更换版本
  • 图的遍历之 深度优先搜索和广度优先搜索
  • Java学习笔记27——file类
  • 细胞——求细胞数量 C++详解
  • 【计算机视觉】关于图像处理的一些基本操作
  • Android Animation Made Easy
  • 56从零开始学Java之与字符串相关的正则表达式
  • STM32 定时器自动重装载寄存器ARR带来的影响,ARPE0和1区别
  • vue 把<style scoped lang=“less“> 单独写成less文件再导入使用
  • C++ 字符串
  • springboot 报错处理(长期更新 2023.8.10)
  • Maven出现报错 ; Unable to import maven project: See logs for details错误的多种解决方法
  • 33_windows环境debug Nginx 源码-安装WSL
  • Java中的ZooKeeper是什么?
  • 【数学】CF1796 C
  • SCI论文中字体和图片字体大小的要求
  • react-dnd的使用
  • ELF program/section segment解析
  • 【golang】库源码文件
  • 网络安全(黑客)常用工具(附配套资料+工具安装包)
  • WebDAV之π-Disk派盘+Joplin
  • Unity-UGUI优化策略
  • 【练】Linux中用共用体(联合体)的方式,判断本机的字节序
  • WebRTC | 音视频直播客户端框架
  • flutter开发实战-实现marquee根据文本长度显示文本跑马灯效果
  • 8.10论文阅读
  • 【计算机网络笔记】第一章
  • 开源力量再现,国产操作系统商业化的全新探索