多数元素(169)
根据题意这道题是让返回该数组中出现次数大于1/2数组长度的数,因此不管怎样解决我们都要遍历1次数组,获取到每个元素出现的次数,因此这就需要我们用到HashMap,我们可以将该元素存储到key中,将出现的次数存储到Value中。这样我们通过遍历HashMap就可以取出符合要求的值
当Map中没有出现过该数时
// 用HashMap来存储数组中的值 key为值,Value默认为0,每出现1次就+1
HashMap<Integer,Integer> map = new HashMap<>();
//遍历数组
for(int num : nums){
//如果map中没有出现过,就存进去
if(!map.containsKey(num)){
//Value默认为0,每出现1次就+1
map.put(num,0);
}
当Map中出现过该数时我们就将他的出现次数+1
//存在,就把次数+1
map.put(num,map.get(num)+1);
最后遍历一遍Map中的Key找到Key中Value大于数组长度一半的返回即可
int half = nums.length / 2;
//遍历HashMap取出符合要求的值
for(int key : map.keySet()){
if(map.get(key)>half){
return key;
}
}
return -1;
代码解答
class Solution {
public int majorityElement(int[] nums) {
// 用HashMap来存储数组中的值 key为值,Value默认为0,每出现1次就+1
HashMap<Integer,Integer> map = new HashMap<>();
//遍历数组
for(int num : nums){
//如果map中没有出现过,就存进去
if(!map.containsKey(num)){
//Value默认为0,每出现1次就+1
map.put(num,0);
}
//存在,就把次数+1
map.put(num,map.get(num)+1);
}
int half = nums.length / 2;
//遍历HashMap取出符合要求的值
for(int key : map.keySet()){
if(map.get(key)>half){
return key;
}
}
return -1;
}
}
注意
在存储HashMap时是从0开始存储的,若是从1开始计算,if后面需要加上else
只出现一次的数字(136)
这道题与上面的多数元素类似,也是要求元素出现的次数,这次是只出现1次的,
因此我们一样使用HashMap来进行实现
当Map中没有出现过该数时
for(int num : nums){
if(!map.containsKey(num)){
map.put(num,1);
}
当Map中出现过该数时我们就将他的出现次数+1
map.put(num,map.get(num)+1);
找到符合要求的Key
//遍历HashMap找到符合条件的值
for(int key : map.keySet()){
if(map.get(key) == 1){
return key;
}
}
return -1;
代码解答
class Solution {
public int singleNumber(int[] nums) {
HashMap<Integer,Integer> map = new HashMap<>();
//遍历数组
for(int num : nums){
if(!map.containsKey(num)){
map.put(num,1);
}else{
map.put(num,map.get(num)+1);
}
}
//遍历HashMap找到符合条件的值
for(int key : map.keySet()){
if(map.get(key) == 1){
return key;
}
}
return -1;
}
}