LeetCode Hot 100:矩阵

LeetCode Hot 100:矩阵

73. 矩阵置零

思路 1:辅助数组

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = m ? matrix[0].size() : 0;
        vector<int> row(m, false), col(n, false);
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                if (matrix[i][j] == 0) {
                    row[i] = true;
                    col[j] = true;
                }

        for (int i = 0; i < m; i++)
            if (row[i] == true)
                for (int j = 0; j < n; j++)
                    matrix[i][j] = 0;
        for (int j = 0; j < n; j++)
            if (col[j] == true)
                for (int i = 0; i < m; i++)
                    matrix[i][j] = 0;
    }
};

思路 2:常量额外空间

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = m ? matrix[0].size() : 0;
        int flag_col0 = false, flag_row0 = false;
        for (int i = 0; i < m; i++)
            if (matrix[i][0] == 0)
                flag_col0 = true;

        for (int j = 0; j < n; j++)
            if (matrix[0][j] == 0)
                flag_row0 = true;

        for (int i = 1; i < m; i++)
            for (int j = 1; j < n; j++)
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }

        for (int i = 1; i < m; i++)
            for (int j = 1; j < n; j++)
                if (matrix[i][0] == 0 || matrix[0][j] == 0)
                    matrix[i][j] = 0;

        if (flag_col0)
            for (int i = 0; i < m; i++)
                matrix[i][0] = 0;

        if (flag_row0)
            for (int j = 0; j < n; j++)
                matrix[0][j] = 0;
    }
};

54. 螺旋矩阵

思路 1:模拟

class Solution {
private:
    // 向右、向下、向左、向上
    vector<vector<int>> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        // 特判
        if (matrix.empty())
            return {};

        int m = matrix.size(), n = matrix[0].size();
        vector<int> ans(m * n, 0);
        vector<vector<bool>> visited(m, vector<bool>(n, false));
        int r = 0, c = 0;
        int dirIdx = 0;
        for (int i = 0; i < m * n; i++) {
            ans[i] = matrix[r][c];
            visited[r][c] = true;
            int nextRow = r + directions[dirIdx][0],
                nextColumn = c + directions[dirIdx][1];
            // 遇到边界,转向
            if (nextRow < 0 || nextRow >= m || nextColumn < 0 ||
                nextColumn >= n || visited[nextRow][nextColumn])
                dirIdx = (dirIdx + 1) % 4;
            r += directions[dirIdx][0];
            c += directions[dirIdx][1];
        }

        return ans;
    }
};

思路 2:模拟

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        // 特判
        if (matrix.empty())
            return {};

        int m = matrix.size(), n = m ? matrix[0].size() : 0;
        vector<int> ans(m * n, 0);
        int index = 0;
        // 边界标记
        int left = 0, right = n - 1;
        int top = 0, bottom = m - 1;
        
        while (index < m * n) {
            // 向右
            for (int i = left; i <= right && index < m * n; i++)
                ans[index++] = matrix[top][i];
            top += 1;
            // 向下
            for (int i = top; i <= bottom && index < m * n; i++)
                ans[index++] = matrix[i][right];
            right -= 1;
            // 向左
            for (int i = right; i >= left && index < m * n; i--)
                ans[index++] = matrix[bottom][i];
            bottom -= 1;
            // 向上
            for (int i = bottom; i >= top && index < m * n; i--)
                ans[index++] = matrix[i][left];
            left++;
        }

        return ans;
    }
};

48. 旋转图像

思路 1:原地模拟

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        // 特判
        if (n == 1)
            return;

        for (int i = 0; i < n / 2; i++) {
            for (int j = 0; j < (n + 1) / 2; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - j - 1][i];
                matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
                matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
                matrix[j][n - i - 1] = temp;
            }
        }
    }
};

240. 搜索二维矩阵 II

思路 1:从左下角开始

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty())
            return false;

        int m = matrix.size(), n = m ? matrix[0].size() : 0;
        int i = m - 1, j = 0;

        while (i >= 0 && j < n) {
            if (matrix[i][j] == target)
                return true;
            else if (matrix[i][j] > target)
                i--;
            else
                j++;
        }
        
        return false;
    }
};

思路 2:从右下角开始

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty())
            return false;

        int m = matrix.size(), n = m ? matrix[0].size() : 0;
        int i = 0, j = n - 1;

        while (i < m && j >= 0) {
            if (matrix[i][j] == target)
                return true;
            else if (matrix[i][j] > target)
                j--;
            else
                i++;
        }

        return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值