在 Python 中,求出前 N 个自然数的排列中有多少个子数组,使得它们的中位数为 M
假设我们有一个数组 A,其中包含前 N 个自然数的排列,并且还给出了另一个数字 M,其中 M < N,我们必须求出有多少个子数组,使得该序列的中位数为 M。我们知道,序列的中位数定义为按升序排序后位于序列中间的元素的值。对于偶数长度序列,使用两个中间元素的左侧。
因此,如果输入为 A = [3, 5, 6, 4, 2] 和 M = 5,则输出将为 4,因为所需的子数组为 [3, 5, 6]、[5]、[5, 6] 和 [5, 6, 4]。
为了解决这个问题,我们将遵循以下步骤 −
n := arr 的大小
my_map := a new map
my_map[0] := 1
has := False, add := 0, result := 0
for i in range 0 to n, do
如果 arr[i] < m,则
add := add - 1
否则当 arr[i] > m,则
add := add + 1
如果 arr[i] 与 m 相同,则
has := True
如果 has 为 True,则
如果 add 存在于 my_map 中,则
result := result + my_map[add]
如果 add-1 存在于 my_map 中,则
result := result + my_map[add - 1]
否则,
my_map[add] := (my_map[add] 的值,如果存在,否则为 0) + 1
返回 result
示例
让我们看看下面的实现以便更好地理解 −
def solve(arr, m):
n = len(arr)
my_map = {}
my_map[0] = 1
has = False
add = 0
result = 0
for i in range(n):
if (arr[i] < m):
add -= 1
elif (arr[i] > m):
add += 1
if (arr[i] == m):
has = True
if (has):
if(add in my_map):
result += my_map[add]
if add-1 in my_map:
result += my_map[add - 1]
else:
my_map[add] = my_map.get(add, 0) + 1
return result
arr = [3, 5, 6, 4, 2]
m = 5
print(solve(arr, m))
输入
[3, 5, 6, 4, 2] , 5
输出
3
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

