Python程式:根據行和列的總和查詢有效的矩陣
假設我們有兩個陣列 `rowSum` 和 `colSum`,它們包含非負值,其中 `rowSum[i]` 包含第 i 行元素的總和,`colSum[j]` 包含第 j 列元素的總和。我們需要找到一個大小為 ( `rowSum` 大小 x `colSum` 大小) 的具有非負值的矩陣,以滿足給定的 `rowSum` 和 `colSum` 值。
因此,如果輸入類似於 `rowSum = [13,14,12]`,`colSum = [9,13,17]`,則輸出將是……
9 | 4 | 0 |
0 | 9 | 5 |
0 | 0 | 12 |
為了解決這個問題,我們將遵循以下步驟:
- matrix := 建立一個空矩陣
- visited := 一個新的集合
- 定義一個函式 `minimum()`。它將接收 r, c 作為引數。
- min_total := 無窮大
- type := 空字串
- 對於範圍從 0 到 r 的大小 - 1 的 i,執行:
- 如果 r[i] < min_total,則:
- index := i
- type := 'row'
- min_total := r[i]
- 如果 r[i] < min_total,則:
- 對於範圍從 0 到 c 的大小 - 1 的 i,執行:
- 如果 c[i] < min_total,則:
- min_total := c[i]
- type := 'col'
- index := i
- 如果 c[i] < min_total,則:
- 如果 type 等於 'row',則:
- r[index] := 無窮大
- 對於範圍從 0 到 c 的大小 - 1 的 i,執行:
- 如果 c[i] 不等於無窮大且 c[i] >= min_total,則:
- c[i] := c[i] - min_total
- matrix[index, i] := min_total
- 跳出迴圈
- 如果 c[i] 不等於無窮大且 c[i] >= min_total,則:
- 如果 type 等於 'col',則:
- c[index] := 無窮大
- 對於範圍從 0 到 r 的大小 - 1 的 i,執行:
- 如果 r[i] 不等於無窮大且 r[i] >= min_total,則:
- r[i] := r[i] - min_total
- matrix[i, index] := min_total
- 跳出迴圈
- 如果 r[i] 不等於無窮大且 r[i] >= min_total,則:
- 將 (index, type) 對插入 visited
- 在主方法中執行以下操作:
- 當 visited 的大小不等於 r 的大小 + c 的長度時,執行:
- minimum(r, c)
- 返回 matrix
示例
讓我們看看下面的實現來更好地理解:
def solve(r, c): matrix = [[0]*len(c) for _ in range(len(r))] visited = set() def minimum(r,c): min_total = float('inf') type = '' for i in range(len(r)): if(r[i] < min_total): index = i type = 'row' min_total = r[i] for i in range(len(c)): if(c[i] < min_total): min_total = c[i] type = 'col' index = i if(type == 'row'): r[index] = float('inf') for i in range(len(c)): if(c[i] != float('inf') and c[i] >= min_total): c[i] -= min_total matrix[index][i] = min_total break if(type == 'col'): c[index] = float('inf') for i in range(len(r)): if(r[i] != float('inf') and r[i] >= min_total): r[i] -= min_total matrix[i][index] = min_total break visited.add((index,type)) while len(visited) != len(r)+len(c): minimum(r,c) return matrix rowSum = [13,14,12] colSum = [9,13,17] print(solve(rowSum, colSum))
輸入
[13,14,12], [9,13,17]
輸出
[[9, 4, 0], [0, 9, 5], [0, 0, 12]]
廣告