zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【转载】Python未来互联网主流语言! . 天高地厚
    Android系统Intent的使用(转)
    android:获取联系人信息(姓名和电话)
    CMNET和CMWAP区别(转)
    Android界面开发推荐颜色
    android : framelayout 研究
    android : drag and drop ui
    android 四种模式研究之一
    ListView与CheckBox,EditText,Button结合
    android 之 custom view(一)
  • 原文地址:https://www.cnblogs.com/likaiming/p/9529098.html
Copyright © 2011-2022 走看看