zoukankan      html  css  js  c++  java
  • JZ28 数组中出现次数超过一半的数字

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

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

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

    本题常见的三种解法:

    哈希表统计法: 遍历数组 nums ,用 HashMap 统计各数字的数量,即可找出 众数 。此方法时间和空间复杂度均为 O(N)O(N) 。
    数组排序法: 将数组 nums 排序,数组中点的元素 一定为众数。
    摩尔投票法: 核心理念为 票数正负抵消 。此方法时间和空间复杂度分别为 O(N)O(N) 和 O(1)O(1) ,为本题的最佳解法。

    func check(nums []int, val int) bool {
        sz := 0
        for _, v := range nums {
            if v == val {
                sz++
            }
        }
        if sz > len(nums) / 2 {
            return true
        }
        return false
    }
    func MoreThanHalfNum_Solution(nums []int) int {
        vote := 0
        x := nums[0]
        for _, num := range nums {
            // 票数抵消
            if vote == 0  {
                // 假设当前数为众数
                x = num
            }
            if num == x {
                // 投正票
                vote += 1
            } else {
                // 投反票
                vote -= 1
            }
        }
        if check(nums, x) {
            return x
        }
       
        return 0
    }
  • 相关阅读:
    jquery-卡片翻转
    bootstrap-3-验证表单
    jqeury-地区三级联动
    bootstrap-实现loading效果
    Thymeleaf-语法整理
    jquery-网站收藏
    ssh-免密登录批量发送脚本
    linux-网站收藏
    关闭防火墙
    hadoop-网站收藏
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14639335.html
Copyright © 2011-2022 走看看