这个问题要求我们在一个非空数组中找到多数元素,即出现次数大于 ⌊n/2⌋ 的元素。我们可以利用摩尔投票算法(Boyer-Moore Voting Algorithm)来解决这个问题,该算法高效且仅使用常量额外空间。
算法思路
- 初始化候选元素和计数器:选择数组的第一个元素作为候选多数元素,计数器初始化为1。
- 遍历数组:
- 如果当前元素与候选元素相同,计数器加1。
- 如果当前元素与候选元素不同,计数器减1。
- 如果计数器减到0,更换候选元素为当前元素,并将计数器重置为1。
- 返回候选元素:由于题目保证数组中总是存在多数元素,遍历结束后,候选元素即为多数元素。
Java实现
public class Solution {
public int majorityElement(int[] nums) {
int candidate = nums[0];
int count = 1;
for (int i = 1; i < nums.length; i++) {
if (count == 0) {
candidate = nums[i];
count = 1;
} else if (nums[i] == candidate) {
count++;
} else {
count--;
}
}
return candidate;
}
}
代码解释
- 初始化:将数组的第一个元素设为候选多数元素
candidate
,计数器count
初始化为1。 - 遍历数组:
- 如果
count
为0,表示当前候选元素不可能是多数元素,更换候选元素为当前元素,并重置count
为1。 - 如果当前元素与候选元素相同,
count
加1。 - 如果当前元素与候选元素不同,
count
减1。
- 如果
- 返回结果:遍历结束后,
candidate
即为多数元素。
复杂度分析
- 时间复杂度:O(n),只需遍历数组一次。
- 空间复杂度:O(1),只使用了常数个额外变量。
通过摩尔投票算法,我们可以在线性时间内找到多数元素,且仅使用常量额外空间。速度依旧高效,虽然内存也是同样占用不少。