zoukankan      html  css  js  c++  java
  • leetcode(三)

    leedcode—problem861

    rank:medium

    1.问题

    给定一个二维的矩阵(矩阵的数全由1和0组成),任意反转矩阵的每一行和每一列(0反转成1,1反转成0),求出最大矩阵分数,矩阵分数的求法是矩阵每一行代表二进制数,首位是最高位,根据二进制求出十进制,计算出每一行的十进制后,将所有十进制相加,返回结果,详细描述如图所示

    2.解决方案

     1 class Solution:
     2     def matrixScore(self, A):
     3         """
     4         :type A: List[List[int]]
     5         :rtype: int
     6         """
     7         height = len(A)
     8         width = len(A[0])
     9         
    10         def toggle_row(A, row):
    11             for j in range(width):
    12                 if A[row][j]:
    13                     A[row][j] = 0
    14                 else:
    15                     A[row][j] = 1
    16             return A
    17         
    18         def toggle_column(A, column):
    19             for i in range(height):
    20                 if A[i][column]:
    21                     A[i][column] = 0
    22                 else:
    23                     A[i][column] = 1
    24             return A
    25         
    26         def count_column_one(A, column):
    27             num = 0
    28             for i in range(height):
    29                 if A[i][column] == 1:
    30                     num += 1
    31             return num
    32                     
    33         for i in range(height):
    34             if A[i][0] == 0:
    35                 A = toggle_row(A, i)
    36         
    37         for j in range(width-1):
    38             num = count_column_one(A, j+1)
    39             if num < height/2:
    40                 A = toggle_column(A,j+1)
    41         from functools import reduce
    42         result = 0 
    43         for i in range(height):
    44             result += reduce(lambda x,y: x*2+y, A[i])
    45         return result

    具体思路:首先我们要知道怎么能求出最大矩阵分数,一个二进制数,它的值大小,最高位是贡献最大(1/2值),比后面低位加起来贡献还大,所以要使这个二进制数尽可能大,最高位必须为1,也就是矩阵所有的行的第一位需置1,所以这里有一个toggle_row函数,用来反转行让首位置1。然后再是列反转,列反转的条件是在当前列,数字1的个数小于矩阵行数的1/2,则说明0的个数较多,反转列(使用toggle_column)将增大结果,依次循环第二列到最后一列即可。最后利用reduce函数求出每一行的结果并进行求和即可。

    参考

    1.https://leetcode.com/contest/weekly-contest-91/problems/score-after-flipping-matrix/

  • 相关阅读:
    common-pool2连接池详解与使用
    Nginx实现页面缓存
    Nginx实现动静分离
    lnmp环境下nginx配置‘负载均衡’
    用phpstudy搭建的lnmp环境下mysql授权远程连接
    新浪OAuth网络登录,请求access_token时遇到21323的错误
    使用curl进行模拟登录
    yii2.0分页
    yii2.0表单自带验证码
    yii2.0查询关联数据以及widgets小部件
  • 原文地址:https://www.cnblogs.com/fydeblog/p/9267375.html
Copyright © 2011-2022 走看看