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
    }
  • 相关阅读:
    关于javascript获取页面高度宽度
    regexp_substr在oracle9i的替换方案
    iOS-数据存储
    iOS-导入XMPP框架
    iOS-WWDC
    iOS-在Xcode中使用Git进行源码版本控制(转)
    iOS-AFN
    iOS-网络基础
    iOS-UIDynamic
    iOS-动画
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14639335.html
Copyright © 2011-2022 走看看