import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
* <p>
* 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
* <p>
* 示例 1:
* <p>
* 输入: [3,2,3]
* 输出: 3
* <p>
* 示例 2:
* <p>
* 输入: [2,2,1,1,1,2,2]
* 输出: 2
* <p>
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/majority-element
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
class Solution {
/**
* 由于众数出现的频率大于n/2,所以在排序之后众数必存在于下标[n/2]处(本题默认数组中是一定存在众数的,所以返回下标[n/2]可行)
*
* @param nums
* @return
*/
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length / 2];
}
/**
* 排序后取对应的大于长度的值
*
* @param nums
* @return
*/
public int majorityElement2(int[] nums) {
if (nums == null || nums.length == 0) {
throw new IllegalArgumentException();
}
Arrays.sort(nums);
int length = nums.length;
int currentCount = 1;
for (int i = 0; i < length; i++) {
int data = nums[i];
while (length > i + 1 && nums[i] == nums[i + 1]) {
currentCount++;
i++;
if (currentCount > length / 2) {
return data;
}
}
currentCount = 1;
}
return nums[0];
}
/**
* hash计数法
*
* @param nums
* @return
*/
public int majorityElement3(int[] nums) {
if (nums == null || nums.length == 0) {
throw new IllegalArgumentException();
}
Map<Integer, Integer> dataCountMap = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int data = nums[i];
if (dataCountMap.get(data) == null) {
dataCountMap.put(data, 1);
} else {
int count = dataCountMap.get(data);
if (count >= nums.length / 2) {
return data;
}
dataCountMap.put(data, count + 1);
}
}
int maxCountkey = 0;
int maxCountdata = 0;
Set<Integer> keySet = dataCountMap.keySet();
for (Integer dada : keySet) {
int count = dataCountMap.get(dada);
if (count > maxCountkey) {
maxCountkey = count;
maxCountdata = dada;
}
}
return maxCountdata;
}
}
public class MainClass {
public static int[] stringToIntegerArray(String input) {
input = input.trim();
input = input.substring(1, input.length() - 1);
if (input.length() == 0) {
return new int[0];
}
String[] parts = input.split(",");
int[] output = new int[parts.length];
for (int index = 0; index < parts.length; index++) {
String part = parts[index].trim();
output[index] = Integer.parseInt(part);
}
return output;
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
int[] nums = stringToIntegerArray(line);
int ret = new Solution().majorityElement(nums);
String out = String.valueOf(ret);
System.out.print(out);
}
}
}
网上大牛写的用投票法解决
基本思路:
摩尔投票法,遇到相同的数,就投一票,遇到不同的数,就减一票,最后还存在票的数就是众数
class Solution {
public int majorityElement(int[] nums) {
int count = 0;
Integer candidate = null;
for (int num : nums) {
if (count == 0) {
candidate = num;
}
count += (num == candidate) ? 1 : -1;
}
return candidate;
}
}