LintCode_主元素
2015-10-28 21:46
253 查看
问题描述:
给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。
样例:给出数组[1,1,1,1,2,2,2],返回 1
挑战:要求时间复杂度为O(n),空间复杂度为O(1)
算法:
方法一:这种做法的缺点是,nums中有很大的数时,要求num[
]数组的内存空间也要很大
方法二:其实,这就是排序的另一种考察方式;我们可以先将nums排序,排序完后的数列中中间的数字肯定是出现次数大于nums长度的二分之一的数;
给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。
样例:给出数组[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]; }
相关文章推荐
- 用C++实现“按任意键继续”
- spring使用dwr异步通信
- XML就像是扩展应用范围的HTML
- delphi 数组的使用
- hdoj 1532 Drainage Ditches【最大流模板题】
- boost::bind
- 关于apache tomcat的几个版本
- const ||c
- Java堆栈详解
- c++ 程序输入参数
- 最小生成树-Prim
- IOS--导航栏
- jQuery获取Select选择的Text(非表单元素)和 Value(表单元素)(转)
- HDU 1244 Max Sum Plus Plus Plus DP
- 系统安装相关:U盘刻录(用U盘装ubuntu简要方法)
- android studio 更改背景和设置字体大小
- win7提示“ipconfig不是内部或外部命令”
- 《大道至简第五章》
- 最短路径基础
- OC第一节--OC的基本