问题描述
小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。
测试样例
样例1:
输入:
array = [1, 3, 8, 2, 3, 1, 3, 3, 3]
输出:3
样例2:
输入:
array = [5, 5, 5, 1, 2, 5, 5]
输出:5
样例3:
输入:
array = [9, 9, 9, 9, 8, 9, 8, 8]
输出:9
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Main {
public static int solution(int[] array) {
// 初始化候选元素和计数器
int candidate = 0;
int count = 0;
// 遍历数组
for (int num : array) {
// 如果计数器为0,更新候选元素
if (count == 0) {
candidate = num;
}
// 如果当前元素与候选元素相同,增加计数器
if (num == candidate) {
count++;
} else {
// 否则减少计数器
count--;
}
}
// 验证候选元素是否确实是多数元素
count = 0;
for (int num : array) {
if (num == candidate) {
count++;
}
}
// 如果候选元素的出现次数超过数组长度的一半,返回候选元素
if (count > array.length / 2) {
MarsCode AI
MarsCode AI
好的,我可以给你一些代码提示来帮助你解决这个问题。我们可以使用摩尔投票算法(Boyer-Moore Voting Algorithm)来高效地找到出现次数超过数组长度一半的元素。这个算法的时间复杂度是O(n),空间复杂度是O(1)。
以下是一些代码提示:
-
初始化变量:
- 你需要一个变量来存储当前候选元素(即可能的多数元素)。
- 你还需要一个计数器来记录当前候选元素的票数。
-
遍历数组:
- 遍历数组中的每一个元素。
- 如果计数器为0,将当前元素设为候选元素,并将计数器设为1。
- 如果当前元素与候选元素相同,增加计数器。
- 如果当前元素与候选元素不同,减少计数器。
-
验证结果:
- 遍历结束后,候选元素就是可能的多数元素。
- 你可以再次遍历数组,验证这个元素的出现次数是否确实超过数组长度的一半。
以下是代码框架:
java
public class Main {
public static int
solution(int[] array)
{
// 初始化候选元素和计
数器
int candidate = 0;
int count = 0;
// 遍历数组
for (int num :
array) {
// 如果计数器为
0,更新候选元素
if (count ==
0) {
candidate
= num;
}
// 如果当前元素
与候选元素相同,
增加计数器
if (num ==
candidate) {
count++;
} else {
// 否则减少
计数器
count--;
}
}
// 验证候选元素是否确
实是多数元素
count = 0;
for (int num :
array) {
if (num ==
candidate) {
count++;
}
}
// 如果候选元素的出现
次数超过数组长度的一
半,返回候选元素
if (count > array.
length / 2) {
return
candidate;
} else {
// 这里可以根据
题目要求处理异常
情况
throw new
IllegalArgumen
tException
("No majority
element
found");
}
}
public static void
main(String[] args) {
// 测试用例
System.out.println
(solution(new int
[]{1, 3, 8, 2, 3,
1, 3, 3, 3}) ==
3);
}
}
你可以根据这个框架继续完善你的代码。如果你有任何问题或需要进一步的帮助,请告诉我!
摩尔投票算法是什么?
给我一些代码提示
帮我检查一下编辑区的代码