LeetCode | 数组
题1. 独一无二的出现次数
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
示例:
输入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。
思路:
Java:用一个map储存下每个元素出现的个数,完了以后用map的value建立一个set,比较map和set的size。
class Solution {
public boolean uniqueOccurrences(int[] arr) {
Map<Integer,Integer> counter=new HashMap<>();
for(int elem:arr){
counter.put(elem,counter.getOrDefault(elem,0)+1);
}
HashSet<Integer> counter_set=new HashSet<>(counter.values());
return counter_set.size()==counter.size();
}
}
题2 主要元素问题
数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。
思路1:
用一个map记录各元素出现的次数
class Solution {
public int majorityElement(int[] nums) {
HashMap<Integer,Integer> counter=new HashMap<>();
for (int elem:nums){
counter.put(elem,counter.getOrDefault(elem,0)+1);
}
for (Integer key:counter.keySet()){
if(counter.get(key)>nums.length/2){
return key;
}
}
return -1;
}
}
思路2: 摩尔投票法
找出2个不同的数两两抵消,如果最后存在没有抵消的数,说明该数可能是主要元素.
进行验证。
1)如果major是主要元素,major总个数一定大于>n/2
2)如果major总个数大于>n/2,major不一定是主要元素,可能是没参加抵消的漏网之鱼。
class Solution {
int majorityElement(int[] nums) {
// 摩尔投票算法
int major=0;
int cnt = 0;
for(int x : nums){
if(cnt == 0){
major = x;
cnt++;
}else{
if(major == x)
cnt++;
else
cnt--;
}
}
if(cnt > 0){
int t = 0;
for(int x : nums)
if(x == major)
t++;
if(t > nums.length/2)
return major;
}
return -1;
}
}
时间:O(n)
空间:O(1)