zoukankan      html  css  js  c++  java
  • 主元素问题

    来自豆瓣网友的解决方案:

    已知一个数组的大小,并且其中存在一个数,出现的频率大于50%,则称其为该数组的主元素。用一个算法找出这个数,要求其时间复杂度尽可能低。(这个问题貌似还是计算机专业的考研试题啊)

    解法:

    声明一个变量count = 0,声明一个常量size等于数组大小。
    假设该数组的第一个元素a(1)为主元素,让其与a(2)进行比较,若相同,则使变量count+1,若不同,则count-1。然后继续比较a(3)。以此类推。
    当与a(n)比较后,count = -1时,将count重新归为0,并重新假设a(n+1)为主元素,并继续与a(n+2)作比较。
    当count>=(size-m)/2时,此时假设的主元素a(m)即为实际的主元素。
    或遍历完整个数组后,当前假设的主元素为实际主元素。

    结论:

    这个算法的时间复杂度最大才O(N),看书看到这一段时令我顿时拍案叫绝啊。其核心思想在于:对于这样一个数组,去除掉任意两个不相等的数,剩下的数中,主元素的出现频率仍然大于50%。而使用count来进行加减计数,当count=0时,必然是偶数个数与假设的主元素进行了比较,且其中有一半与假设数相同一半与假设数不同(当count=-1时,加上假设数的集合,也满足该条件)。

    java实现:

    public static String NewFind(int [] a){
    
        if(a.length==0){
            return "Array is empty!";
        }else if(a.length==1){
            return Integer.toString(a[0]);
        }else{
            int count=1;
            String msg="NOT FOUND";
            for(int i=0;i<a.length;i++) {
                for(int j=i+1;j<a.length;j++) {
                    if(a[i]==a[j]){
                        count++;
                        if(count>(a.length/2)){
                            msg=Integer.toString(a[i]);
                            return msg;
                       }
                    }
                }
                count=1;
            }
            return msg;
        }
    }
    

    PS:此处java代码 没有验证过,先记录一下 有时间验证一下。

  • 相关阅读:
    Python3 sorted() 函数
    [Python网络编程]一个简单的TCP时间服务器
    [爬虫]统计豆瓣读书中每个标签下的前两百本书
    [leetcode]39. Combination Sum
    [leetcode]18. 4Sum
    [leetcode DP]72. Edit Distance
    [leetcode DP]120. Triangle
    [leetcode DP]91. Decode Ways
    [leetcode DP]70. Climbing Stairs
    [leetcode DP]64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/snail-gao/p/11996724.html
Copyright © 2011-2022 走看看