• 剑指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;
        }
    

      

  • 相关阅读:
    VUE中实现iview的图标效果时遇到的一个问题
    VUE中获取url中的值
    VUE的生命周期
    基于Vue的省市区三级联动插件
    父子组件通讯(2)
    vue中声明式导航和编程式导航
    java Calendar(日历)
    java Date
    java equals
    java 内部类
  • 原文地址:https://www.cnblogs.com/ghlz/p/13329071.html
Copyright © 2020-2023  润新知