和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

JZ28 数组中出现次数超过一半的数字

原题链接


描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。你可以假设数组是非空的,并且给定的数组总是存在多数元素。1<=数组长度<=50000,0<=数组元素<=10000。


示例1

输入:[1,2,3,2,2,2,5,4,2]
返回值:2

思路一

快排,取最中间的元素即可(手写的快排在牛客中栈溢出😫,力扣就没问题)。

解答

package com.klaus.math.prob28;

import java.util.Arrays;

public class Solution {

    public int MoreThanHalfNum_Solution(int[] array) {
        
        qSort(array, 0, array.length - 1);
        // Arrays.sort(array);
        return array[array.length / 2];
    }

    private void qSort(int[] arr, int low, int high) {
        if (low >= high) return;
        int i = low, j = high, tmp = arr[low];
        while (i < j) {
            while (i < j && arr[j] >= tmp) j--;
            while (i < j && arr[i] <= tmp) i++;
            if (i < j) {
                int t = arr[i];
                arr[i] = arr[j];
                arr[j] = t;
            }
        }
        arr[low] = arr[i];
        arr[i] = tmp;
        qSort(arr, low, i - 1);
        qSort(arr, i + 1, high);
    }

}

思路二

使用haspmap,数组中的元素作为 key,元素每出现一次,就把 key 对应的value +1。最后遍历 hashmap,找到 value 大于二分之一数组长度的 key。

解答二

import java.util.HashMap;
import java.util.Map;

public class Solution {
    public int MoreThanHalfNum_Solution(int[] array) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int len = array.length / 2;

        for (int a : array) {
            int cnt = map.getOrDefault(a, 0);
            map.put(a, cnt + 1);
        }
        for (Map.Entry<Integer, Integer> m : map.entrySet()) {
            if (m.getValue() > len)
                return m.getKey();
        }
        return 0;
    }
}

思路三

原链接这里,膜拜。


解答三

package com.klaus.math.prob28;

public class Solution3 {
    public int MoreThanHalfNum_Solution(int[] array) {
        int vote = 0, x = 0;
        for (int num : array) {
            if (vote == 0) x = num;
            vote += num == x ? 1 : -1;
        }
        return x;
    }
}
posted @ 2021-08-22 11:58  klaus08  阅读(28)  评论(0编辑  收藏  举报