给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。
方法1:使用hashmap来存储数组中的元素及对应的次数。空间复杂度较高。
public class Solution {
/**
* @param nums: a list of integers
* @return: find a majority number
*/
public int majorityNumber(ArrayList<Integer> nums) {
// write your code
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0;i<nums.size();i++){
if(!map.containsKey(nums.get(i))){
map.put(nums.get(i),1);
}else{
map.put(nums.get(i),map.get(nums.get(i))+1);
}
if(map.get(nums.get(i))>nums.size()/2){
return nums.get(i);
}
}
return -1;
}
}
方法2:设置一个count来计数,一个value为数组第一个元素。遍历数组,当数组中的元素与value相等时,就将count++;当数组中的元素与value不相等时,就将count--。如果count值小于0,那么就将value设置为当前的数组元素。那么遍历到最后一个元素的时候,value即为主元素了。空间复杂度降低。代码如下:
public class Solution {
/**
* @param nums: a list of integers
* @return: find a majority number
*/
public int majorityNumber(ArrayList<Integer> nums) {
// write your code
int count = 0;
int value = nums.get(0);
for(int i=0;i<nums.size();i++){
if(nums.get(i) == value){
count++;
}else{
count--;
}
if(count<0){
value = nums.get(i);
}
}
return value;
}
}