找出整形数组中占比超过一半的数 | 豆包MarsCode AI 刷题

66 阅读3分钟

一、题目分析:

给定一个数字序列,其中有一个数字的出现次数超过了序列长度的一半。
需要找到这个出现次数超过一半的数字,即所谓的“众数”。

二、解题思路:

1.摩尔投票算法:这是一个线性时间复杂度的算法,可以在O(n)时间内找到可能的众数。
2.验证阶段:由于题目保证了一定存在一个数字出现次数超过一半,所以找到的候选众数一定是正确答案,但通常情况下,需要验证候选众数是否真的出现次数超过一半。

三、具体步骤:

1.初始化两个变量,一个用于存储候选众数(candidate),另一个用于记录候选众数的计数(count)。
2.遍历数字序列:
(1)如果当前数字与候选众数相同,则增加计数。
(2)如果计数为0,则将当前数字设为新的候选众数,并将计数设置为1。
(3)如果当前数字与候选众数不同,则减少计数。
3.遍历结束后,候选众数即为所求的数字。

四、代码分析:

类和方法定义
public class Main:定义了一个公共类Main。
public static int solution(int] array):定义了一个公共静态方法 solution ,它接受-个整数数组 array 作为参数,并返回一个整数。
solution方法定义了一个计数器count int count=0;用于记录当前候选元素的出现次数。
Integer candidate=null;定义了个Integer 类型的变量 candidate,用于存储当前可能的多数元素。
循环逻辑
使用增强型for循环for(int num:array):遍历数组中的每个元素。
if(count == 0):如果计数器 count 为0,说明没有候选元素,或者之前的候选元素已经被抵消。此时,将当前元素 num 设置为新的候选元素 candidate。
count+=(num==candidate)?1:-1;:果当前元素 num 等于候选元素 candidate ,则计数器 count 加1;否则,计数器 count 减1。这是摩尔投票算法的核心,它确保了多数元素最终会成为候选元素。
main方法
public static void main(string[] args)定义了主方法,程序的入口点。
System.out.println(solution(new int[]{1.3,8,2,3,1,3,3,3})==3);:测试用例,检查 solution 方法是否能够正确地返回出现次数超过一半的元素(在这个例子中是3)。
System.out.println(solution(new int[]{99,9,9,8,9,8,8})==9);:另一个测试用例,同样检查 so1ution 方法是否能够正确地返回多数元素(在这个例子中是9)。 image.png 代码正确性
这段代码正确实现了摩尔投票算法,能够有效地找到出现次数超过一半的元素。
代码中的测试用例也是正确的,因为它们确实包含了出现次数超过一半的元素。

五、总结:

通过摩尔投票算法,我们可以在O(n)的时间复杂度内找到出现次数超过一半的数字。这个算法不仅效率高,而且实现简单,适用于解决此类问题。