C#实现Matrix Elements Sum:求上方无0的非0矩阵元素之和
嘿,我来帮你搞定这个问题!你的思路方向是对的——按列优先遍历确实是解决这个问题的好办法,核心就是要在每一列里跟踪「是否已经出现过0」,这样就能轻松判断当前元素是否符合「上方没有0」的条件了。
核心逻辑拆解
我们需要给每一列单独维护一个标记,用来记录这一列从顶部到当前位置是否已经出现过0:
- 遍历每一列时,先把标记初始化为
false(还没遇到0); - 从上到下遍历该列的每个元素:
- 如果标记已经是
true,说明上方已经有0了,直接跳过当前元素; - 如果当前元素是0,把标记设为
true,后续元素都不用再考虑; - 如果当前元素不为0且标记是
false,就把它加到总和里。
- 如果标记已经是
代码示例(C#)
public static int CalculateValidSum(int[][] matrix) { int total = 0; // 先处理空矩阵的边界情况 if (matrix == null || matrix.Length == 0 || matrix[0].Length == 0) return total; int rowCount = matrix.Length; int colCount = matrix[0].Length; // 按列优先遍历 for (int col = 0; col < colCount; col++) { bool hasZeroAbove = false; for (int row = 0; row < rowCount; row++) { int currentVal = matrix[row][col]; if (hasZeroAbove) continue; // 上方已有0,直接跳过 if (currentVal == 0) { hasZeroAbove = true; // 标记该列后续元素都无效 continue; } // 满足条件,累加 total += currentVal; } } return total; }
举个例子验证
比如这个测试矩阵:
1 2 3 0 4 5 6 7 0
按照逻辑计算:
- 第一列:1(有效,加)→ 遇到0,标记为
true→ 6被跳过,贡献1; - 第二列:2(加)→4(加)→7(加),贡献13;
- 第三列:3(加)→5(加)→遇到0,标记为
true,贡献8;
最终总和是1+13+8=22,完全符合要求。
这个逻辑简单直接,而且时间复杂度是O(row*col),效率拉满,你可以把这段代码放到你的项目里测试看看效果~
内容的提问来源于stack exchange,提问作者Grizzly
相关产品推荐
相关产品推荐

