首頁>技術>

題目

有一個二維矩陣 A 其中每個元素的值為 0 或 1 。

移動是指選擇任一行或列,並轉換該行或列中的每一個值:將所有 0 都更改為 1,將所有 1 都更改為 0。

在做出任意次數的移動後,將該矩陣的每一行都按照二進位制數來解釋,矩陣的得分就是這些數字的總和。

返回儘可能高的分數。

示例:輸入:[[0,0,1,1],[1,0,1,0],[1,1,0,0]] 輸出:39

解釋:轉換為 [[1,1,1,1],[1,0,0,1],[1,1,1,1]]

0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39

提示:1 <= A.length <= 20

1 <= A[0].length <= 20

A[i][j] 是 0 或 1

解題思路分析

1、遍歷;時間複雜度O(n^2),空間複雜度O(1)

func matrixScore(A [][]int) int {	var res int	if len(A) == 0 || len(A[0]) == 0 {		return 0	}	// 翻轉行,每行第一個為0則翻轉	for i := 0; i < len(A); i++ {		if A[i][0] == 0 {			for j := 0; j < len(A[i]); j++ {				A[i][j] = 1 - A[i][j]			}		}	}	// 翻轉列,每列1的數量大於0則翻轉	for j := 0; j < len(A[0]); j++ {		a, b := 0, 0		for i := 0; i < len(A); i++ {			if A[i][j] == 0 {				a++			} else {				b++			}		}		if a <= b {			continue		}		for i := 0; i < len(A); i++ {			A[i][j] = 1 - A[i][j]		}	}	for i := 0; i < len(A); i++ {		sum := 0		for j := 0; j < len(A[i]); j++ {			sum = sum*2 + A[i][j]		}		res = res + sum	}	return res}

2、遍歷;時間複雜度O(n^2),空間複雜度O(1)

func matrixScore(A [][]int) int {	var res int	if len(A) == 0 || len(A[0]) == 0 {		return 0	}	n := len(A)	m := len(A[0])	// 首先每行第一個都為1求和,n個長度為m的1x...x	// 這樣保證第一列全為1	res = res + n*(1<<(m-1))	for j := 1; j < m; j++ {		a, b := 0, 0		for i := 0; i < n; i++ {			if A[i][0] == 0 && A[i][j] == 0 { // 需要翻轉				b++			} else if A[i][0] == 1 && A[i][j] == 1 { // 不需要翻轉				b++			} else {				a++			}		}		// 1比0多,不需要翻轉		if a <= b {			res = res + b*(1<<(m-1-j))		} else {			res = res + a*(1<<(m-1-j))		}	}	return res}
總結

Medium題目,為了最大,每行第一個為0則翻轉每行,每列1的數量大於0的數量則翻轉

6
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 幾種程式語言對比