数组中有一个数的出现次数超过了数组长度的一半,找出这个数。
排序
排序后输出n/2位置的数,时间复杂度O(nlogn)
import java.util.Arrays;
public int MoreThanHalfNum_Solution2(int[] array)
{
if(array == null || array.length <= 0)
return 0;
Arrays.sort(array);
int result = array[array.length / 2];
int count = 0;
for(int i = 0; i < array.length; i++)
{
if(array[i] == result)
count++;
}
if(count*2 <= array.length)
return 0;
return result;
}
散列表
时间复杂度O(n),空间复杂度O(n).
import java.util.HashMap;
public int MoreThanHalfNum_Solution3(int[] array)
{
if(array == null || array.length <= 0)
return 0;
//构造HashMap
HashMap<Integer, Integer> map = new HashMap<>();
int key;
int value = 1;
for(int i = 0; i < array.length; i++)
{
key = array[i];
if(map.containsKey(key))
{
value = map.get(key) + 1;
map.put(key, value);
}
else{
map.put(key,value);
}
}
for(int i = 0; i<array.length;i++ )
{
key = array[i];
if(map.containsKey(key))
{
value = map.get(key);
if(value*2 > array.length)
return key;
}
}
return 0;
}
记录两个值
时间复杂度O(n)
public int findOneNumber(int a[])
{
int candidate = a[0];
int nTimes = 1;
for(int i = 1; i < a.length; i++)
{
if(nTimes == 0)
{
candidate = a[i];
nTimes = 1;
}
else{
if(candidate == a[i])
nTimes++;
else
nTimes--;
}
}
return candidate;
}
Java
public int MoreThanHalfNum_Solution(int[] array)
{
if(array == null || array.length <= 0)
return 0;
int result = array[0];
int times = 1;
for(int i = 1; i < array.length; i++)
{
if(times == 0)
{
result = array[i];
times = 1;
}
else if(array[i] == result)
times++;
else {
times--;
}
}
int count = 0;
for(int i = 0; i<array.length; i++)
{
if(array[i] == result)
count++;
}
if(count * 2 <= array.length)
return 0;
return result;
}