LeetCode矩阵题型

以三角形遍历矩阵

for (int i = 0; i < matrix.size(); ++i) {
    for (int j = i + 1; j < matrix[i].size(); ++j)
        swap(matrix[i][j], matrix[j][i]);
}

 

48. Rotate Image https://leetcode.com/problems/rotate-image/description/

 

54. Spiral Matrix https://leetcode.com/problems/spiral-matrix/description/

vector<int> spiralOrder(vector<vector<int>>& matrix) {
    vector<int> result;
    if (matrix.size() == 0) return result;
    int rightend = matrix[0].size() - 1;
    int buttomend = matrix.size() - 1;
    int leftend = 0;
    int topend = 0;
    int x = 0;
    int y = 0;
    while (true) {
        for (; x <= rightend; x++)
            result.push_back(matrix[y][x]);
        topend++;
        x--;
        if (++y > buttomend)
            break;

        for (; y <= buttomend; y++)
            result.push_back(matrix[y][x]);
        rightend--;
        y--;
        if (--x<leftend)
            break;

        for (; x >= leftend; x--)
            result.push_back(matrix[y][x]);
        buttomend--;
        x++;
        if (--y<topend)
            break;

        for (; y >= topend; y--)
            result.push_back(matrix[y][x]);
        leftend++;
        y++;
        if (++x>rightend)
            break;
    }
    return result;
}
View Code

1、代码中的循环使用xy,左边方式和数组寻址的位置正好相反

2、在每次循环之后,x或y的值都会偏移到end之后,所以需要更正

3、循环之后还要调整坐标,让下一个方向的遍历不会加入重复元素 

 

59. Spiral Matrix II https://leetcode.com/problems/spiral-matrix-ii/description/

vector<vector<int>> generateMatrix(int n) {
    vector<vector<int>> result(n, vector<int>(n));
    if (n == 0) return result;
    int rightend = n - 1;
    int buttomend = n - 1;
    int leftend = 0;
    int topend = 0;
    int x = 0;
    int y = 0;
    int current = 1;
    while (true) {
        for (; x <= rightend; x++)
            result[y][x] = current++;
        x--;
        topend++;
        if (++y>buttomend)
            break;

        for (; y <= buttomend; y++)
            result[y][x] = current++;
        y--;
        rightend--;
        if (--x<leftend)
            break;

        for (; x >= leftend; x--)
            result[y][x] = current++;
        x++;
        buttomend--;
        if (--y<topend)
            break;

        for (; y >= topend; y--)
            result[y][x] = current++;
        y++;
        leftend++;
        if (++x>rightend)
            break;
    }
    return result;
}
View Code

1、按照上一题反过来就可以了

 

 73. Set Matrix Zeroes https://leetcode.com/problems/set-matrix-zeroes/description/

    void setZeroes(vector<vector<int>>& matrix) {
        vector<int> rows;
        vector<int> clos;
        for(int i=0;i<matrix.size();i++){
            for(int j=0;j<matrix[0].size();j++){
                if(matrix[i][j] == 0){
                    rows.push_back(i);
                    clos.push_back(j);
                }
            }
        }
        
        for(int i=0;i<rows.size();i++){
            for(int j=0;j<matrix[rows[i]].size();j++){
                matrix[rows[i]][j] = 0;
            }
        }
        
        for(int i=0;i<clos.size();i++){
            for(int j=0;j<matrix.size();j++){
                matrix[j][clos[i]] = 0;
            }
        }
    }
View Code

1、考虑使用第一行和第一列来记录上面所说的行和列的置0情况,这里问题是那么第一行和第一列自己怎么办?想要记录它们自己是否要置0,只需要两个变量(一个是第一行,一个是第一列)就可以了。然后就是第一行和第一列,如果要置0,就把它的值赋成0(反正它最终也该是0,无论第一行或者第一列有没有0),否则保留原值。然后根据第一行和第一列的记录对其他元素进行置0。最后再根据前面的两个标记来确定是不是要把第一行和第一列置0就可以了。这样的做法只需要两个额外变量,所以空间复杂度是O(1)

 

48

54

59

73

posted @ 2019-03-12 14:07  番茄汁汁  阅读(335)  评论(0编辑  收藏  举报