今日心情:生活在慢慢走上正轨,慢慢走总能达到想去的地方。
题目描述:
LeetCode 剑指 Offer 39. 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解题代码 1:(看的题解思路:投票法 时间复杂度O(n)+ 空间复杂度O(1))
class Solution {
public int majorityElement(int[] nums) {
int vote = 0;
int x = 0;
for(int num : nums){
if(vote == 0){
x = num;
}
vote += (num == x) ? 1 : -1;
}
return x;
}
}
解题代码 2:(自己想的思路:HasMap统计 时间复杂度O(n)+ 空间复杂度O(n))
class Solution {
public int majorityElement(int[] nums) {
int half = nums.length/2;
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);
}
}
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
if(entry.getValue() > half){
return entry.getKey();
}
}
return -1;
}
}
解题思路1:
题解方法主要利用了题目中可以假设数组是非空的,并且给定的数组总是存在多数元素。所以一定存在这样的数,其出现次数超过数组半数。
(1)可以判断如果当前投票数为 0 , 则将当前值保存起来,与下一个值进行比较,如果当前值与下一个值相等,则投票加1,否则投票-1;
(2)然后当投票为0的时候就更新比较值;
(3)遍历完成后投票值一定大于0,此时的保存的值就是出现次数超过数组半数的数。
主要就是利用了该数出现次数一定是大于半数数组长度的特性。
解题思路2:
自己首先拿到题想到的就是使用HashMap进行统计,然后找到出现次数超过数组半数的值,操作时间复杂度为O(n), 空间复杂度为O(n)。看题解使用的投票方法可以将空间复杂度优化到 O(1)。
(1)遍历数组,将所有数存入HashMap中,如果当前数不存在于HashMap,当前数作为key,值为1,如果当前数已经存在于HashMap中,则更新以当前数为key的值,获取以当前数为key的值然后加1进行更新;
(2)遍历map,获取值大于半数数组长度的key;
(3)返回找到的key值。