给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [3,2,3] 输出: 3 示例 2:
输入: [2,2,1,1,1,2,2] 输出: 2
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
使用哈希表解决,本来是考虑在循环内部直接输出的,这样只要找到目标元素就结束,后续不不必在遍历,节省时间,如下:
class Solution {
public int majorityElement(int[] nums) {
Map<Integer,Integer> map = new HashMap();
int len = nums.length;
for(int i=0;i<len;i++){
if(!map.containsKey(nums[i])){
map.put(nums[i],1);
}else{
map.put(nums[i],map.get(nums[i])+1);
if(map.get(nums[i])>len/2) return nums[i];
}
}
return -1;
}
}
但是这种写法对于只有一个或两个不同的元素的数组是不可行的,所以只有遍历完数组后再遍历哈希表
class Solution {
public int majorityElement(int[] nums) {
Map<Integer,Integer> map = new HashMap();
int len = nums.length;
for(int i=0;i<len;i++){
if(!map.containsKey(nums[i])){
map.put(nums[i],1);
}else{
map.put(nums[i],map.get(nums[i])+1);
}
}
for(Integer key:map.keySet()){
if(map.get(key)>len/2){
return key;
}
}
return -1;
}
}
再有就是双重遍历比较元素出现的次数,找到即返回
class Solution {
public int majorityElement(int[] nums) {
for(int num:nums){
int count=0;
for(int tag:nums){
if(tag==num){
count++;
}
}
if(count>nums.length/2){
return num;
}
}
return -1;
}
}
最后比较巧的方式是先对数组排序,然后取第length/2个元素就是目标元素
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
}
第二、三方法是看评论后学习的。