Score After Flipping Matrix

本文介绍了解决LeetCode上ScoreAfterFlippingMatrix问题的方法。该问题要求通过翻转矩阵的行或列来最大化矩阵的分数,其中矩阵由0和1组成,每行被视为一个二进制数。解决方案首先确保每行的第一个元素为1,然后优化每列以增加总的二进制值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[leetcode]Score After Flipping Matrix

链接:https://leetcode.com/problems/score-after-flipping-matrix/description/

Question

We have a two dimensional matrix A where each value is 0 or 1.

A move consists of choosing any row or column, and toggling each value in that row or column: changing all 0s to 1s, and all 1s to 0s.

After making any number of moves, every row of this matrix is interpreted as a binary number, and the score of the matrix is the sum of these numbers.

Return the highest possible score.

Example 1

Input: [[0,0,1,1],[1,0,1,0],[1,1,0,0]]
Output: 39
Explanation:
Toggled to [[1,1,1,1],[1,0,0,1],[1,1,1,1]].
0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39


Note:

1 <= A.length <= 20
1 <= A[0].length <= 20
A[i][j] is 0 or 1.

Solution

// 想法是先通过toggle每一个row让每一行的第一个数字是1,然后逐行toggle后面的每一列,让每一列的1最多
class Solution {
public:
  int matrixScore(vector<vector<int>>& A) {
    int row = A.size();
    int col = A[0].size();
    int cnt = 0;
    for (int i = 0; i < row; i++) {
      if (A[i][0] == 0) {
        for (int j = 0; j < col; j++) {
          A[i][j] = !A[i][j];
        }
      }
      cnt += (1 << (col-1));
    }
    for (int j = 1; j < col; j++) {
      int zeros = 0, ones = 0;
      for (int i = 0; i < row; i++) {
        if (A[i][j] == 0) zeros++;
        else ones++;
      }
      int max_val = max(zeros, ones);
      cnt += (1 << (col-j-1))*max_val;
    }
    return cnt;
  }
};

思路:看代码注释~

### 关于翻转路径的算法 在图或树中,“翻转路径”的概念通常涉及改变节点之间的连接方向或者调整边的方向,使得某些特定条件得到满足。这种操作常见于有向无环图(DAG)、二叉树或其他类型的树形数据结构中的问题。 #### 图中的路径翻转 对于图中的路径翻转,可以考虑以下几种情况: - **反转子图中的所有边**:如果目标是从某个源节点到目标节点的路径被完全反转,则可以通过深度优先搜索(DFS)找到该路径并记录每条边的信息。随后逐一修改这些边的方向[^1]。 ```python def reverse_path_in_graph(graph, source, target): visited = set() path = [] def dfs(node): if node == target: return True visited.add(node) for neighbor in graph[node]: if neighbor not in visited: path.append((node, neighbor)) if dfs(neighbor): return True path.pop() # Backtrack return False if dfs(source): reversed_edges = [(v, u) for u, v in path] new_graph = {k: [] for k in graph} for u, v in reversed_edges: new_graph[u].append(v) return new_graph else: raise ValueError("No valid path found between {} and {}".format(source, target)) ``` 此代码片段展示了如何通过 DFS 找到一条从 `source` 到 `target` 的路径,并将其反转为新的图结构[^1]。 --- #### 树中的路径翻转 在树中,路径翻转可能意味着交换两个节点之间的一系列父子关系。例如,在一棵二叉树中,假设我们希望将根节点到某一叶子节点的路径上的所有左孩子变为右孩子,反之亦然: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def flip_path_to_leaf(root, leaf_value): if not root: return None stack = [(root, [])] parent_map = {} while stack: current, ancestors = stack.pop() if current.val == leaf_value: break if current.left: parent_map[current.left] = (current, 'left') stack.append((current.left, ancestors + ['left'])) if current.right: parent_map[current.right] = (current, 'right') stack.append((current.right, ancestors + ['right'])) if current.val != leaf_value: return None # Leaf value not found prev_node = current for direction in reversed(ancestors): parent, side = parent_map[prev_node] if side == 'left': setattr(parent, 'right', getattr(parent, 'left')) delattr(parent, 'left') # Optional cleanup elif side == 'right': setattr(parent, 'left', getattr(parent, 'right')) delattr(parent, 'right') # Optional cleanup prev_node = parent return root ``` 这段代码实现了从根节点到指定叶节点路径的翻转逻辑。它利用栈来模拟递归过程,并动态更新父节点的孩子指针以完成路径翻转。 --- #### 应用场景扩展 除了基本的数据结构调整外,路径翻转还可以应用于更复杂的领域,比如医疗图像分析中的连通区域分割[^3] 或者自然语言处理中的依存句法树重排[^2]。具体实现取决于实际需求和输入数据的形式。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值