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

    题目:

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

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

    示例 1:

    输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
    输出: 2

    限制:

    1 <= 数组长度 <= 50000

    解题思路1:

    由于要寻找的是出现次数超过数组长度一半的数字,首先想到的数组进行排序,其次就发现所要寻找的数字就是数组最中间的数字。

    代码1:

    public static int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[(nums.length)/2];
    }
    

    解题思路2:

    摩尔算法:

    每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。

    这里利用count模拟摩尔投票。

    代码2:

    public static int majorityElement(int[] nums) {
            int number = 0;//记录取出的数据
            int count = 0;//记录取出数据去掉每次比较后不同的数字的个数
            for (int i = 0; i < nums.length; i++) {
                if (count == 0) {//count为0时才放入数据,否则一直在抵消不相同的数据
                    number = nums[i];
                }
    
                if (nums[i] != number) {
                    count--;
                }else {
                    count++;
                }
            }
            return number;
        }
    

      

  • 相关阅读:
    AC自动机 [模板]
    ChonSu [ZOJ 2684]
    Quad Tiling [POJ 3420]
    LCA 最近公共祖先 [POJ 1330]
    强连通分量[trajan]
    高斯消元 [模板]
    01K Code [HDU 1545]
    Cycle Game [ZOJ 2686]
    清除Eclipse中的内置浏览器中的历史记录(REF)
    第三方的 NET 数据库连接提供者,Lightswitch
  • 原文地址:https://www.cnblogs.com/ghlz/p/13329071.html
Copyright © 2011-2022 走看看