leetcode是一个适合学习代码的网站,里面资源大多免费,很适合准备进入互联网行业的初学者进行基础知识的综合性学习,往往能在面试过程中帮助大部分求职者解决面试过程中遇到的手撕代码题。
链接如下:https://leetcode.com 里面可以切换为中国地区,仅需电话号码就可以注册登录,非常方便。
接下来介绍里面常见的一道热门题

这道题的要求很简单,主要的思想就是模拟。我们可以将矩阵看成若干层,首先填入矩阵最外层的元素,其次填入矩阵次外层的元素,直到填入矩阵最内层的元素。
定义矩阵的第 k 层是到最近边界距离为 k 的所有顶点。
对于每层,从左上方开始以顺时针的顺序填入所有元素。假设当前层的左上角位于 (top,left),右下角位于 (bottom,right),按照如下顺序填入当前层的元素。
从左到右填入上侧元素,依次为 (top,left) 到 (top,right)。
从上到下填入右侧元素,依次为 (top+1,right) 到 (bottom,right)。
如果 left<right 且 top<bottom,则从右到左填入下侧元素,依次为 (bottom,right−1) 到 (bottom,left+1),以及从下到上填入左侧元素,依次为 (bottom,left) 到 (top+1,left)。
填完当前层的元素之后,将 left 和 top 分别增加 1,将 right 和 bottom 分别减少 1,进入下一层继续填入元素,直到填完所有元素为止。
(leetcode官方给出的题解思路)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int t=0,b=n-1;
int l=0,r=n-1;
vector<vector<int>> ans(n,vector<int>(n));
int k=1;
while(k<=n*n){
for(int i=l;i<=r;++i,++k) ans[t][i]=k;
++t;
for(int i=t;i<=b;++i,++k) ans[i][r]=k;
--r;
for(int i=r;i>=l;--i,++k) ans[b][i]=k;
--b;
for(int i=b;i>=t;--i,++k) ans[i][l]=k;
++l;
}
return ans;
}
};这种算法的时间复杂度为O(n2),空间复杂度为O(1)
默认评论
Halo系统提供的评论