在 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 := 陣列大小
my_map := 一個新的對映
my_map[0] := 1
has := False,add := 0,result := 0
對於 i 從 0 到 n,執行:
如果 arr[i] < m,則
add := add - 1
否則,如果 arr[i] > m,則
add := add + 1
如果 arr[i] 等於 m,則
has := True
如果 has 為真,則
如果 my_map 中存在 add,則
result := result + my_map[add]
如果 my_map 中存在 add - 1,則
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
廣告