相关标签
一、题目要求
二、题解和代码实现
1.题解
2.代码实现
代码如下(示例):
//分治
class Solution {
public int majorityElement(int[] nums) {
int res = majorityElementvol(nums, 0, nums.length - 1);
return res;
}
public int majorityElementvol(int[] nums,int low, int high){
// 如果划分的子数组只有一个元素,则这个元素就是多数元素
if (low == high){
return nums[low];
}
// 如果不是一个元素
int mid = low +(high-low)/2;
// 获取左数组的多数元素
int lowmaxval = majorityElementvol(nums, low, mid);
// 获取右数组的多数元素
int highmaxval= majorityElementvol(nums, mid+1, high);
// 左数组的多数元素与右数组的多数元素相等,则此元素必然是原数组的多数元素
if (lowmaxval == highmaxval){
return lowmaxval;
}
// 左数组的多数元素与右数组的多数元素不相等
int lowcount =0;
int highcount =0;
// 统计左数组的多数元素的个数,右数组的多数元素的个数
for (int i = low; i <=high; i++) {
if (nums[i] ==lowmaxval){
lowcount++;
}
if (nums[i] == highmaxval){
highcount++;
}
}
// 谁个数多谁就是多数元素
return lowcount>highcount ? lowmaxval :highmaxval;
}
}
//摩尔投票法
class Solution {
public int majorityElement(int[] nums) {
if (nums==null || nums.length ==0){
return -1;
}
int val = nums[0];//假设第一个元素是目标
int count = 1;//初始化它个数
for (int i = 1; i < nums.length; i++) {
if (val == nums[i]){//当相同时
count++;//标记个数增加
}else if (count==0){//当个数为0时,说明数据都被拼完了
count++;//把个数赋重新初始化
val = nums[i];//假设当前i下标元素为目标值
}else {//当val 不同num[i]时,并且count不等于0
count--;//个数-1,和不同的元素拼掉
}
}
//这样超过半数的元素值,最终会留下来
return val;
}
}
//hashmap解法
class Solution {
public int majorityElement(int[] nums) {
int midVal = nums.length/2;
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
if (map.containsKey(num)){
map.put(num,map.get(num)+1);
}else {
map.put(num,1);
}
}
Set<Integer> keySet = map.keySet();
for (Integer integer : keySet) {
if (map.get(integer)>midVal){
return integer;
}
}
return 0;
}
}