数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
方法一:暴力遍历,时间复杂度为O(n2)
public class Solution {
public static void main(String[] args) {
int[] array = {1};
Solution s = new Solution();
System.out.println(s.MoreThanHalfNum_Solution(array));
}
public int MoreThanHalfNum_Solution(int [] array) {
if(array==null||array.length<=0){
return 0;
}
if(array.length==1){
return array[0];
}
for(int i=0;i<array.length;++i)
{
int nTimes=0;
for(int j=0;j<array.length;++j)
{
if(array[j]==array[i])
++nTimes;
}
if(nTimes>array.length/2)
return array[i];
}
return 0;
}
}
方法二:先对数组进行排序,排好序以后n/2处的就是要找的数。
public class Solution {
public static void main(String[] args) {
int[] array = {1,2,3,2,2,2,5,4,2};
Solution s = new Solution();
System.out.println(s.MoreThanHalfNum_Solution(array));
}
public int MoreThanHalfNum_Solution(int [] array) {
if(array==null||array.length<=0){
return 0;
}
if(array.length==1){
return array[0];
}
Arrays.sort(array);
int mid = array[array.length/2];
int j = 0;
for (int i=0; i<array.length;i++){
if (array[i] == mid){
j++;
}
}
return j > array.length/2 ? mid : 0;
}
}