leetcode编程_众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
方法一:排序取中值
package array;
import java.util.Arrays;
public class mode {
public static void main(String[] args) {
int []arr = {1,1,2,2,2,1,1};
int res = majorityElement(arr);
System.out.println(res);
}
public static int majorityElement(int[] nums) {
Arrays.sort(nums);//排序
return nums[nums.length/2];//返回中间值,中间值为出现频率最高的,即众数
}
}
方法二:摩尔投票算法(Moore voting algorithm)
package array;
public class mode {
public static void main(String[] args) {
int []arr = {1,1,2,2,2,1,1};
int res = majorityElement(arr);
System.out.println(res);
}
public static int majorityElement(int[] nums) {
if(nums.length==1){
return nums[0];
}
int res = nums[0];
int count=1;
for(int i=1;i<nums.length;i++){
if(res==nums[i]){//元素相同则count++
count++;
}else{
count--;//元素不同则count--,类似于抵消
if(count==0){
res = nums[i+1];//count减为0之后重新给res赋值
}
}
}
return res;//存在众数则count大于0,输出此元素
}
}
方法三:遍历比对法
数据较多时不建议使用,时间复杂度较大。
public class mode {
public static void main(String[] args) {
int []arr = {6,5,5};
int res = majorityElement(arr);
System.out.println(res);
}
public static int majorityElement(int[] nums) {
if(nums.length=1){//特殊情况
return nums[0];
}
for(int i=0;i<=nums.length/2;i++){//遍历数组前二分之一的元素
int count=1;
for(int j=i+1;j<nums.length;j++){//比对元素相同与否
if(nums[i]==nums[j]){
count++;
if(count>nums.length/2){
return nums[i];
}
}
}
}
return -1;
}
}