欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

【剑指Offer】28、数组中出现次数超过一半的数字

发布时间:2025/7/25 96 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【剑指Offer】28、数组中出现次数超过一半的数字 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

  题目描述:

  数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
  例如:输入如下所示的一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

  解题思路:

  本题有以下三种方法可解:

  方法一:首先对数组进行排序,在一个有序数组中,次数超过一半的必定是中位数,那么可以直接取出中位数,然后遍历数组,看中位数是否出现次数超过一半,这取决于排序的时间复杂度,最快为O(nlogn)。

  方法二:遍历数组,用 HashMap 保存每个数出现的次数,这样可以从map中直接判断是否有超过一半的数字,这种算法的时间复杂度为O(n),但是这个性能提升是用O(n)的空间复杂度换来的。

  方法三(最优解法):根据数组特点得到时间复杂度为O(n)的算法。根据数组特点,数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数之和还要多。因此,我们可以在遍历数组的时候设置两个值:一个是数组中的数result,另一个是出现次数times。当遍历到下一个数字的时候,如果与result相同,则次数加1,不同则次数减一,当次数变为0的时候说明该数字不可能为多数元素,将result设置为下一个数字,次数设为1。这样,当遍历结束后,最后一次设置的result的值可能就是符合要求的值(如果有数字出现次数超过一半,则必为该元素,否则不存在),因此,判断该元素出现次数是否超过一半即可验证应该返回该元素还是返回0。这种思路是对数组进行了两次遍历,复杂度为O(n)。

  编程实现(Java):

//思路2:用hashmap保存每个数出现的次数public int MoreThanHalfNum_Solution(int [] array) {if(array==null)return 0;Map<Integer,Integer> res=new HashMap<>();int len = array.length;for(int i=0;i<array.length;i++){res.put(array[i],res.getOrDefault(array[i],0)+1);if(res.get(array[i])>len/2)return array[i];}return 0;}//思路3:根据数组特点得到时间复杂度为O(n)的算法public int MoreThanHalfNum_Solution(int [] array) {if(array==null||array.length==0)return 0;int len = array.length;int result=array[0];int times=1;for(int i=1;i<len;i++){if(array[i]==result)times++;else if(times==0){result=array[i];times=1;}elsetimes--;}//检查是否符合times=0;for(int i=0;i<len;i++){if(array[i]==result)times++;if(times>len/2)return result;}return 0;}

转载于:https://www.cnblogs.com/gzshan/p/10810298.html

总结

以上是生活随笔为你收集整理的【剑指Offer】28、数组中出现次数超过一半的数字的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。