题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:我的想法就是用元素当做数组的下标,然后当下标(数)一样的时候这个数加1。最后找出数组中最大的那个数,判断它是否超过给定数组的长度的一半
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int[] list = new int[1024];
for(int i=0;i<1024;i++)
list[i] = 0;
for(int i = 0;i < array.length;i++)
{
//原数组的值为新数组的下标,当遇到相同值时加1
list[array[i]]++;
}
int max = 0;
int index = 0;
//找到最大的那个
for(int i = 0;i<1024;i++)
{
if(list[i]>max)
{
max = list[i];
index = i;
}
}
//判断其是否大于原数组的一半
if(max*2 > array.length)
return index;
return 0;
}
}
但是这样做有点投机取巧,就是我们限定了这个数组中元素的大小不能超过我们设定的数组的大小。这个问题就可以用hashMap来解决了,因为hashMap的(key,value)可以动态的变化
public static int MoreThanHalfNum_Solution(int[] array){
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0;i < array.length;i++)
{
//判断这个数是否已经存在了,不存在则存进去
if(!map.containsKey(array[i]))
{
map.put(array[i], 1);
}
//存在则将它的value值加1
else
{
int count = map.get(array[i]);
map.put(array[i], ++count);
}
}
//Iterator<Entry<Integer, Integer>> iterator = map.entrySet().iterator();
//迭代遍历map
Set<Entry<Integer, Integer>> entrys = map.entrySet();
for (Entry<Integer, Integer> entry : entrys) {
Integer value = entry.getValue();
Integer key = entry.getKey();
//当遇到大于一半的时候返回
if(value>array.length>>1)
return key;
}
return 0;
}