刷题周记(4)——矩阵总结

本周完成了leetcode热题100中的矩阵部分,来做个总结。

总的来说,矩阵部分的题目均较为简单。

列几个我在做题过程中使用的技巧和可能性:第一,矩阵可以从外围一层层向内部递归;第二,矩阵的每一个位置,都可以作为一个“存储”,从而可以尽量不使用更多的空间,而是利用原地的运算;第三,矩阵的一些旋转可以等价于转置和翻转等的结合;第四,可以列出转换的式子再写代码。

以下记录几个题目的代码和思路:

73.矩阵置零

利用第一行和第一列做存储,再用额外的o(1)空间存储第一行和第一列的情况。

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) 
    {
        int m=matrix.size();
        int n=matrix[0].size();
        int flag;
        if(matrix[0][0]==0)
        {
            flag=-3;
        }
        else
        {
            flag=0;
            for(int i=1;i<m;i++)
            {
                if(matrix[i][0]==0)
                {
                    flag=-1;
                    break;
                }
            }
            for(int j=1;j<n;j++)
            {
                if(matrix[0][j]==0)
                {
                    if(flag==-1) 
                    {
                        flag=-3;
                    }
                    else
                    {
                        flag=-2;
                    }
                    break;
                }
            }
        }
        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++)
        {
            if(matrix[i][0]==0)
            {
                for(int j=1;j<n;j++)
                {
                    matrix[i][j]=0;
                }
            }
        }
        for(int j=1;j<n;j++)
        {
            if(matrix[0][j]==0)
            {
                for(int i=1;i<m;i++)
                {
                    matrix[i][j]=0;
                }
            }
        }
        if(flag==0)
        {
            return;
        }
        else if(flag==-1)
        {
            for(int i=0;i<m;i++)
            {
                matrix[i][0]=0;
            }
        }
        else if(flag==-2)
        {
            for(int j=0;j<n;j++)
            {
                matrix[0][j]=0;
            }
        }
        else
        {
            for(int i=0;i<m;i++)
            {
                matrix[i][0]=0;
            }
            for(int j=0;j<n;j++)
            {
                matrix[0][j]=0;
            }
        }
    }
};

54.螺旋矩阵

从外向内一层层处理(类似递归的思路)

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) 
    {
        int m=matrix.size();
        int n=matrix[0].size();
        vector<int> ans;
        int bh=0;
        int bl=0;
        while(m>0&&n>0)
        {
            for(int j=bl;j<bl+n;j++)
            {
                ans.push_back(matrix[bh][j]);
            }
            if(m==1) break;
            for(int i=bh+1;i<bh+m;i++)
            {
                ans.push_back(matrix[i][bl+n-1]);
            }
            if(n==1) break;
            for(int j=bl+n-2;j>bl;j--)
            {
                ans.push_back(matrix[bh+m-1][j]);
            }
            for(int i=bh+m-1;i>bh;i--)
            {
                ans.push_back(matrix[i][bl]);
            }
            m-=2;
            n-=2;
            bl++;
            bh++;
        }
        return ans;
    }
};

48.旋转图像

可以一层层,也可以利用翻转完成,或者列出表达式完成

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) 
    {
        int n=matrix.size();
        int start=0;
        while(n>=2)
        {
            for(int i=0;i<n-1;i++)
            {
                int temp;
                temp=matrix[start][start+i];
                matrix[start][start+i]=matrix[start+n-1-i][start];
                matrix[start+n-1-i][start]=matrix[start+n-1][start+n-1-i];
                matrix[start+n-1][start+n-1-i]=matrix[start+i][start+n-1];
                matrix[start+i][start+n-1]=temp;
            }
            /*for(int i=0;i<matrix.size();i++)
            {
                for(int j=0;j<matrix.size();j++)
                {
                    cout<<matrix[i][j]<<" ";
                }
                cout<<endl;
            }*/
            n-=2;
            start++;
        }    
    }
};

240.搜索二维矩阵

观察矩阵内部的顺序特点,按序斜向出发,从而达到o(m+n)的复杂度。

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) 
    {
        int x=0;
        int y=matrix[0].size()-1;
        while(x<matrix.size()&&y>=0)
        {
            if(matrix[x][y]>target)
            {
                y--;
            }
            else if(matrix[x][y]<target)
            {
                x++;
            }
            else
            {
                return true;
            }
        }
        return false;
    }
};
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇