前言
每天和你一起刷 LeetCode 每日一题~
决定在前言里面加上新内容!新增模块:“本期看点”
本期看点:如何竖着遍历矩阵?
LeetCode 启动!
题目:leetcode.cn/problems/minimum-number-of-flips-to-make-binary-grid-palindromic-i/description/?envType=daily-question&envId=2024-11-15" rel="nofollow">最少翻转次数使二进制矩阵回文 I
代码与解题思路
先读题:题目要求我们找到把矩阵的行或者列变成回文形式的最小次数
首先需要思考的是,怎么样计算把矩阵的行或列变成回文需要的次数?仔细想想可以知道,只有一种情况,那就是遍历矩阵的时候,发现每行/列第一个元素和最后一个元素值不同就需要进行一次转换,次数++ . . . 以此类推
即,我们只需要遍历一遍矩阵就能得到结果,那将行变成回文和列变成回文的情况都遍历一遍,取他们的最小值就能得到题目要求的结果啦,代码如下:
func countGoodNodes(edges [][]int) (ans int) {
func minFlips(grid [][]int) int {// 计算把行都变成回文的次数和把列都变成回文的次数都算出来,取最小即可n, m := len(grid), len(grid[0])// 行的回文次数cntRow := 0for _, row := range grid {for j := 0; j < m/2; j++ {if row[j] != row[m-1-j] {cntRow++}}}// 列的回文次数cntCol := 0for j := 0; j < m; j++ {for i, row := range grid[:n/2] {if row[j] != grid[n-1-i][j] {cntCol++}}}return min(cntRow, cntCol)
}
行的遍历比较简单,直接从左往右,从上到下的正常顺序遍历即可,我们都写过很多了,但竖着遍历直到现在依然让我挺难受的
竖着遍历的核心在于,让 j 也就是二维数组的第二个下标在第一层循环,而第一个下标在第二层循环,但是两个下标本身的位置不变,假如不用语法糖,纯净的遍历代码如下:
func minFlips(grid [][]int) int {// 计算把行都变成回文的次数和把列都变成回文的次数都算出来,取最小即可n, m := len(grid), len(grid[0])// 行的回文次数cntRow := 0for i := 0; i < n; i++ {for j := 0; j < m/2; j++ {if grid[i][j] != grid[i][m-1-j] {cntRow++}}}// 列的回文次数cntCol := 0for j := 0; j < m; j++ {for i := 0; i < n/2; i++ {if grid[i][j] != grid[n-1-i][j] {cntCol++}}}return min(cntRow, cntCol)
}
每天进步一点点,我们明天不见不散~
可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。