• 多数元素(力扣第169题)


    题目:

      给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

    分析:

      1、多数元素即在一组数中出现次数大于 ⌊ n/2 ⌋ 的元素

      2、多数元素在这个数组中一定存在

      这两个条件就决定了这种多数元素一定只可能是一种数,因为它出现的次数大于总数的一半,所以只可能是一种数,不可能是两种或者多种。

    解法:

      1、哈希表

      利用哈希表结构,以数组元素值作为哈希表的key,出现的次数作为value,进行统计,最后比较哪个value值最大,对应的key就是这个多数元素。这个需要额外的空间,时间复杂度和空间复杂度都是O(n)

      2、排序

      分析一下,对这个数组进行从小到达排序,因为多数元素一定存在,所以这个经过排序后的数组,多数元素一定会在n/2这个位置出现,因为它出现频次已经大于一半了,无论将这一组相同的数放置在有序数组的哪些连续位置,都是会经过n/2位置的,所以可以对原数组排序,然后直接返回位于n/2位置的元素。

      3、摩尔投票算法

      该算法的原理是:每次从序列里选择互不相同的两个数字,将它们删除掉也可以称之为“抵消”掉,最后剩下一个数字或几个相同的数字,我们要找的多数元素。

      具体落实到算法的实现就是,定义一个计数变量count,一个变量cur_max表示它是当前的多数元素,初始值设置为count = 1,cur_max = num[0]。然后从第二个元素开始遍历数组,如果遇到的元素和当前多数元素cur_max相同,就count++,如果不同,那就是出现了两个不同的元素,就要进行抵消,就是count--;在遍历的过程中,如果count变为0了那么就要更改cur_max变量的值了,更改为当前正在访问的数组值。最后cur_max值就是多数元素。

    代码1,哈希表:

     public int majorityElement(int[] nums) {
            Map<Integer,Integer> map = new HashMap<>();
            int maxcount = 0;
            int maxnumber = Integer.MAX_VALUE;
    
            for (int i = 0;i < nums.length;i++){
                if (map.get(nums[i]) == null)
                    map.put(nums[i],1);
                else {
                    int temp = map.get(nums[i]);
                    map.put(nums[i],temp+1);
                }
                if (map.get(nums[i]) > maxcount)
                    maxcount = map.get(nums[i]);
            }
            for (int j : nums){
                int tmp = map.get(j);
                if (tmp >= maxcount)
                    maxnumber = j;
            }
            return maxnumber;
    }

    代码2,排序:

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

    代码3,摩尔投票算法:

    public int majorityElement(int[] nums) {
            int count = 1;
            int majority = nums[0];
            for (int i = 1;i < nums.length;i++){
                if (count == 0)
                    majority = nums[i];
                if (nums[i] == majority){
                    count++;
                }else {
                    count--;
                }
            }
            return majority;
    }

    参考:cyc2018

  • 相关阅读:
    发送trim值
    关一些时钟
    不同频率下的pwm配置
    c#鼠标在控件上面,然后显示文字
    C#通过文件路径截取对应的文件夹路径
    C#随机生成连续多少个十六进制数字
    C#检测串口被拔掉等一些触发事件合集
    c#按键Up和Down对Textbox的内容加1减1
    软件架构师工作历程
    软件架构阅读6
  • 原文地址:https://www.cnblogs.com/yxym2016/p/13054810.html
Copyright © 2020-2023  润新知