LintCode_主元素

来源:互联网 发布:下载压缩解压软件 编辑:程序博客网 时间:2024/06/03 09:56

问题描述:

给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。

样例:给出数组[1,1,1,1,2,2,2],返回 1

挑战:要求时间复杂度为O(n),空间复杂度为O(1)
算法:
方法一:这种做法的缺点是,nums中有很大的数时,要求num[ ]数组的内存空间也要很大
public int majorityNumber(ArrayList<Integer> nums) {        // write your code        int [] num=new int[200];        int result=0;        for(int i:nums){            num[i]++;        }                for(int j=0;j<num.length;j++){            if(num[j]>nums.size()/2){                result=j;                break;            }        }        return result;    }

方法二:其实,这就是排序的另一种考察方式;我们可以先将nums排序,排序完后的数列中中间的数字肯定是出现次数大于nums长度的二分之一的数;
    public int majorityNumber2(ArrayList<Integer> nums){                if(nums==null||nums.size()==0){            return 0;        }                       int[] temp=new int[200];        temp[0]=nums.get(0);                int pos=0;                //插入排序        for(int i=1;i<nums.size();i++){            pos=i-1;            while(pos>=0&&nums.get(i)>temp[pos]){                temp[pos+1]=temp[pos];                pos--;            }            temp[pos+1]=nums.get(i);                    }                return temp[nums.size()/2];    }


0 0