首先一般都能想到
private int MoreThanHalfNum_Solution(int[] array) {
if(array==null||array.length==0) return 0;
HashMap<Integer, Integer> m=new HashMap<>();
for (int i = 0; i < array.length; i++) {
if (m.containsKey(array[i])) {
m.put(array[i], m.get(array[i])+1);
}else {
m.put(array[i], 1);
}
}
for(Map.Entry<Integer, Integer> entry:m.entrySet()) {
if(entry.getValue()>array.length/2)
return entry.getKey();
}
return 0;
}
优化1:
但是中间的if-else方法可以用HashMap自带的一种方法
getOrDefault(k,默认值)
如果包含此k,就使用此k的value
如果不包含此k,就使用设置的默认值
m.put(array[i], m.getOrDefault(array[i], 0)+1);
2 优化2
不用添加完所有元素,当出现 相同的元素时>数组的一半 就可以跳出循环。
if (m.get(array[i])>array.length/2) {
break;
}
最后程序为
public int MoreThanHalfNum_Solution(int[] array) {
if(array==null||array.length==0) return 0;
HashMap<Integer, Integer> m=new HashMap<>();
/*
for (int i = 0; i < array.length; i++) {
if (m.containsKey(array[i])) {
m.put(array[i], m.get(array[i])+1);
if (m.get(array[i])>array.length/2) {
break;
}
}else {
m.put(array[i], 1);
}
*/
for (int i = 0; i < array.length; i++) {
m.put(array[i], m.getOrDefault(array[i], 0)+1);
if (m.get(array[i])>array.length/2) {
break;
}
}
for(Map.Entry<Integer, Integer> entry:m.entrySet()) {
if(entry.getValue()>array.length/2)
return entry.getKey();
}
return 0;
}