题目:
数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。
示例 1:
输入:[1,2,5,9,5,9,5,5,5]
输出:5
示例 2:
输入:[3,2]
输出:-1
示例 3:
输入:[2,2,1,1,1,2,2]
输出:2
说明:
你有办法在时间复杂度为 O(N),空间复杂度为 O(1) 内完成吗?
思路:
使用投票算法,主要元素的对立面就是非主要元素,把它们看成一撮就可以了,就是肉搏法。
1.代码如下 MajorityElement.java:
package com.yuhl.right.leetcode;
public class MajorityElement {
public static void main(String[] args) {
int[] nums = {2, 2, 1, 1, 1, 2, 2};
int res = majorityElement(nums);
System.out.println(res);
}
public static int majorityElement(int[] nums) {
int temp = nums[0];
int count = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] == temp) {
count++;
} else {
count--;
}
if (count == 0) {
temp = nums[i];
count = 1;
}
}
int t = nums.length / 2 + 1;
count = 0;
for (int num : nums) {
if (num == temp) count++;
if (count == t) return temp;
}
return -1;
}
}
2.执行结果:
"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe"
2