日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

将矩阵转为一行_LeetCode 力扣官方题解 | 861. 翻转矩阵后的得分

發布時間:2023/12/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将矩阵转为一行_LeetCode 力扣官方题解 | 861. 翻转矩阵后的得分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方藍字設為星標

下面開始今天的學習~

力扣 ?861. 翻轉矩陣后的得分(點擊文末閱讀原文查看題目)題目描述有一個二維矩陣 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。為了做到這一點,我們可以翻轉那些最左邊的數不為 1 的那些行,而其他的行則保持不動。當將每一行的最左邊的數都變為 1 之后,就只能進行列翻轉了。為了使得總得分最大,我們要讓每個列中 1 的數目盡可能多。因此,我們掃描除了最左邊的列以外的每一列,如果該列 0?的數目多于 1 的數目,就翻轉該列,其他的列則保持不變。實際編寫代碼時,我們無需修改原矩陣,而是可以計算每一列對總分數的「貢獻」,從而直接計算出最高的分數。假設矩陣共有 m 行 n 列,計算方法如下:
    • 對于最左邊的列而言,由于最優情況下,它們的取值都為 1,因此每個元素對分數的貢獻都為 2^(n - 1)?,總貢獻為 m * 2^(n - 1)。

    • 對于第 j 列(j > 0,此處規定最左邊的列是第 0 列)而言,我們統計這一列 0,1 的數量,令其中的最大值為 k,則 k 是列翻轉后的 1 的數量,該列的總貢獻為 k*2^(n - j - 1)。需要注意的是,在統計 0,1 的數量的時候,要考慮最初進行的行反轉

    C++?class Solution {public: int matrixScore(vector<vector<int>>& A) { int m = A.size(), n = A[0].size(); int ret = m * (1 << (n - 1)); for (int j = 1; j < n; j++) { int nOnes = 0; for (int i = 0; i < m; i++) { if (A[i][0] == 1) { nOnes += A[i][j]; } else { nOnes += (1 - A[i][j]); // 如果這一行進行了行反轉,則該元素的實際取值為 1 - A[i][j] } } int k = max(nOnes, m - nOnes); ret += k * (1 << (n - j - 1)); } return ret; }};Javaclass Solution { public int matrixScore(int[][] A) { int m = A.length, n = A[0].length; int ret = m * (1 << (n - 1)); for (int j = 1; j < n; j++) { int nOnes = 0; for (int i = 0; i < m; i++) { if (A[i][0] == 1) { nOnes += A[i][j]; } else { nOnes += (1 - A[i][j]); // 如果這一行進行了行反轉,則該元素的實際取值為 1 - A[i][j] } } int k = Math.max(nOnes, m - nOnes); ret += k * (1 << (n - j - 1)); } return ret; }}Golangfunc matrixScore(a [][]int) int { m, n := len(a), len(a[0]) ans := 1 << (n - 1) * m for j := 1; j < n; j++ { ones := 0 for _, row := range a { if row[j] == row[0] { ones++ } } if ones < m-ones { ones = m - ones } ans += 1 << (n - 1 - j) * ones } return ans}JavaScriptvar matrixScore = function(A) { const m = A.length, n = A[0].length; let ret = m * (1 << (n - 1)); for (let j = 1; j < n; j++) { let nOnes = 0; for (let i = 0; i < m; i++) { if (A[i][0] === 1) { nOnes += A[i][j]; } else { nOnes += (1 - A[i][j]); // 如果這一行進行了行反轉,則該元素的實際取值為 1 - A[i][j] } } const k = Math.max(nOnes, m - nOnes); ret += k * (1 << (n - j - 1)); } return ret;};Cint matrixScore(int** A, int ASize, int* AColSize) { int m = ASize, n = AColSize[0]; int ret = m * (1 << (n - 1)); for (int j = 1; j < n; j++) { int nOnes = 0; for (int i = 0; i < m; i++) { if (A[i][0] == 1) { nOnes += A[i][j]; } else { nOnes += (1 - A[i][j]); // 如果這一行進行了行反轉,則該元素的實際取值為 1 - A[i][j] } } int k = fmax(nOnes, m - nOnes); ret += k * (1 << (n - j - 1)); } return ret;}復雜度分析
    • 時間復雜度:O(mn),其中 m 為矩陣行數,n 為矩陣列數。

    • 空間負責度:O(1)。

    BY /?

    本文作者:力扣

    編輯&版式:霍霍

    聲明:本文歸“力扣”版權所有,如需轉載請聯系。

    點個在看,少個?bug?

    總結

    以上是生活随笔為你收集整理的将矩阵转为一行_LeetCode 力扣官方题解 | 861. 翻转矩阵后的得分的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。