第一题:完美偶数计数
问题描述
小C定义了一个“完美偶数”。一个正整数 xx 被认为是完美偶数需要满足以下两个条件:
- xx 是偶数;
- xx 的值在区间 [l,r][l,r] 之间。
现在,小C有一个长度为 nn 的数组 aa,她想知道在这个数组中有多少个完美偶数。
通过问题描述,我们得出该完美偶数所需要的两个条件:
- xx 是偶数。
- xx 的值在区间 [l,r][l,r] 之间。
这道题可以通过数组进行解决,代码如下:
def solution(n: int, l: int, r: int, a: list) -> int:
count = 0
for num in a:
if num % 2 == 0 and l <= num <= r:
count += 1
return count
- 时间复杂度:O(n)
- 空间复杂度:O(1)
首先我们要先创建一个计数器count来统计完美偶数的数量,接着通过for循环对长度为nn的数组aa进行遍历,用
if num % 2 == 0 and l <= num <= r来限定条件,满足条件计数器就加1,最后返回结果即可。
第二题:找出整型数组中占比超过一半的数
问题描述
小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。
这道题可以用多数投票算法解决,代码如下:
def solution(array):
candidate = None
count = 0
for num in array:
if count == 0:
candidate = num
count = 1
elif num == candidate:
count += 1
else:
count -= 1
return candidate
时间复杂度:O(n)
空间复杂度:O(1)
多数投票算法是一种用于寻找数组中出现次数超过一半的元素的有效算法。该算法的核心思想是通过维护一个候选元素和一个计数器来逐步确定这个元素。
举个例子
假设我们有一个数组:
array = [3, 3, 4, 2, 4, 4, 2, 4, 4]
-
开始时,
candidate是空,count是 0。 -
遍历数组:
- 遇到 3,
count变成 1,candidate变成 3。 - 遇到 3,
count变成 2。 - 遇到 4,
count变成 1(因为 3 和 4 票数相抵)。 - 遇到 2,
count变成 0(因为 4 票数又减少)。 - 遇到 4,
count变成 1,candidate变成 4。 - 继续遇到 4,
count不断增加。
- 遇到 3,
最终,遍历结束后,candidate 是 4,它在数组中出现的次数超过了一半。
搞懂多数投票算法原理之后,我们就很容易解决这个问题,直接把模板套上去就好了。
def solution(array):
candidate = None
count = 0
for num in array:
if count == 0:
candidate = num
count = 1
elif num == candidate:
count += 1
else:
count -= 1
return candidate