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

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

java 复制代码
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;
    }
}

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

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

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

java 复制代码
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,侯选数换成下一个数,最后的侯选数就是众数。

java 复制代码
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;
    }
}
相关推荐
CoderYanger12 小时前
递归、搜索与回溯-穷举vs暴搜vs深搜vs回溯vs剪枝:12.全排列
java·算法·leetcode·机器学习·深度优先·剪枝·1024程序员节
Coder-coco12 小时前
在线商城系统|基于springboot vue在线商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·宠物
Slow菜鸟12 小时前
Java开发规范(八)| 安全规范—企业级应用的“架构级底线”
java·开发语言·安全
憨憨崽&12 小时前
进击大厂:程序员必须修炼的算法“内功”与思维体系
开发语言·数据结构·算法·链表·贪心算法·线性回归·动态规划
7***684312 小时前
Spring Boot 热部署
java·spring boot·后端
毕设源码-邱学长12 小时前
【开题答辩全过程】以 基于Java的公职备考在线学习系统的设计与实现为例,包含答辩的问题和答案
java·开发语言·学习
chem411113 小时前
C 语言 函数指针和函数指针数组
c语言·数据结构·算法
Croa-vo13 小时前
Tesla Spring 2026 Co-op 面经:CodeSignal真题解析与通关攻略
java·后端·spring
C***u17613 小时前
【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目
java·spring boot·spring
CodeAmaz13 小时前
Spring 事务失效的 8 种常见场景总结
java·spring·事务失效