最简单也最容易想到的做法,就是先排序,如果存在的话,中间的数字肯定是要求的数字,
然后再遍历一遍数组进行验证即可。但是这种做法,时间复杂度是O(nlogn)。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(null == array || array.length == 0){
return 0;
}
Arrays.sort(array);
int result = array[array.length / 2];
int number = 0;
for(int i = 0 ;i < array.length; i ++){
if(array[i] == result){
number ++;
}
}
return number > array.length/2 ? result: 0;
}
public static void main(String[] args){
int[] array = {1,2,3,2,2,2,5,4,2};
Solution solution = new Solution();
System.out.println(solution.MoreThanHalfNum_Solution(array));
}
}
第二种做法则是利用map。
import java.util.HashMap;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(null == array || array.length == 0){
return 0;
}
HashMap<Integer,Integer> map = new HashMap<>();
for(int i = 0;i < array.length;i++){
Integer temp = map.get(array[i]);
if(null == temp){
map.put(array[i],1);
temp = 1;
}else{
temp++;
map.put(array[i],temp);
}
if(temp > array.length/2 ) return array[i];
}
return 0;
}
public static void main(String[] args){
int[] array = {1,2,3,2,2,2,5,4,2};
Solution solution = new Solution();
System.out.println(solution.MoreThanHalfNum_Solution(array));
}
}
最后一种做法,比较巧妙的想法,则是利用数组特点,因为要求的数字多于数组的一般,则每遇到一个数字,若和之前相同则加1,若不同则减1,若为0则换一个数字,最后剩下的即为要求的数字。
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(null == array || array.length == 0){
return 0;
}
int result = array[0];
int times = 1;
for(int i = 0;i < array.length;i++){
if(times == 0){
result = array[i];
}else if (result == array[i]){
times++;
}else{
times--;
}
}
times = 0;
for(int i = 0;i<array.length;i++){
if(array[i] == result){
times++;
}
}
return times > array.length/2 ? result : 0;
}
public static void main(String[] args){
int[] array = {1,2,3,2,2,2,5,4,2};
Solution solution = new Solution();
System.out.println(solution.MoreThanHalfNum_Solution(array));
}
}