ARTS打卡活动——第一周

这是我第一次打卡,目的就是但愿本身一直保持学习的状态,天天都了解一些新的技术;同时这也是我第一篇博客,写得很差还请见谅!程序员

1.Algorithm 作一个leetcode的算法题

542.01 Matrix
Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell.
The distance between two adjacent cells is 1.
Example 1:算法

Input:
[[0,0,0],
 [0,1,0],
 [0,0,0]]

Output:
[[0,0,0],
 [0,1,0],
 [0,0,0]]

Example 2:数组

Input:
[[0,0,0],
 [0,1,0],
 [1,1,1]]

Output:
[[0,0,0],
 [0,1,0],
 [1,2,1]]

解答:首先很容易就想到DP,dist[i,j]=min(dist[i-1,j]+1, disti+1+1, disti+1, disti+1, disti),每一个点与它的邻接点对比,取最小的,扫描每一行每一列,直到没有变动为止,代码以下:函数

class Solution
{
public:
    vector<vector<int>> updateMatrix(vector<vector<int>> &matrix)
    {
        vector<vector<int>> ret(matrix.size());
        int max = 10001;
        for (int i = 0; i < matrix.size(); i++)
        {
            vector<int> vRow(matrix[i].size());
            for (int j = 0; j < matrix[i].size(); j++)
            {
                vRow[j] = matrix[i][j] == 0 ? 0 : max;
            }
            ret[i] = vRow;
        }
        bool b = true;
        while (b)
        {
            b = false;
            for (int i = 0; i < matrix.size(); i++)
            {
                for (int j = 0; j < matrix[i].size(); j++)
                {
                    //up
                    if (i - 1 >= 0 && ret[i][j] > ret[i - 1][j] + 1)
                    {
                        b = true;
                        ret[i][j] = ret[i - 1][j] + 1;
                    }
                    //down
                    if (i + 1 < matrix.size() && ret[i][j] > ret[i + 1][j] + 1)
                    {
                        b = true;
                        ret[i][j] = ret[i + 1][j] + 1;
                    }
                    //left
                    if (j - 1 >= 0 && ret[i][j] > ret[i][j - 1] + 1)
                    {
                        b = true;
                        ret[i][j] = ret[i][j - 1] + 1;
                    }
                    //right
                    if (j + 1 < matrix[i].size() && ret[i][j] > ret[i][j + 1] + 1)
                    {
                        b = true;
                        ret[i][j] = ret[i][j + 1] + 1;
                    }
                }
            }
        }
        return ret;
    }
};

这种算法的时间复杂度为O(r*c*k),其中r和c分别为行数和列数,k是迭代的次数,若是0和1都相距很近的话,这个算法很快就迭代完成,然而若是0和1相距很远,好比矩阵只有左上角存在一个0,那么右下角的1须要迭代约(r+c)/2次,这样最糟的状况时间复杂度会上升一个级别,代码提交,耗时188ms;学习

因而想另一种算法减小冗余的计算,很容易就想到每一个0点就像水里的波浪同样,一步一步的往四周扩散,每一次扩散(距离+1),获得的结果就是最终结果,因而就联想到BFS算法,代码以下(耗时168ms):编码

class Solution
{
public:
    vector<vector<int>> updateMatrix(vector<vector<int>> &matrix)
    {
        int row = matrix.size();
        int col = matrix[0].size();
        vector<vector<int>> ret(row, vector<int>(col, -1));
        struct Point{
            int x;
            int y;
            public:
            Point(int _x, int _y) {
                x = _x;
                y = _y;
            }
            Point() {
                x = 0;
                y = 0;
            }
        };
        struct Point p[10001];
        int l = 0, r  = 0;
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < col; j++)
            {
                if (matrix[i][j] == 0) {
                    ret[i][j] = 0;
                    p[r++] = Point(i, j);
                }
            }
        }
        Point diff[4] = {{-1,0}, {1,0}, {0,-1}, {0,1}};
        while (l < r) {
            Point cur = p[l++];
            int nextDist = ret[cur.x][cur.y] + 1;
            for (int i = 0; i < 4; i++) {
                int newX = cur.x + diff[i].x;
                int newY = cur.y + diff[i].y;
                if (newX >=0 && newX < row && newY >= 0 && newY < col && ret[newX][newY] == -1) {
                    ret[newX][newY] = nextDist;
                    p[r++] = Point(newX, newY);
                    }
            }
        }
        return ret;
    }
};

这里有个点须要注意下,就是定义结构数组struct Point p[10001],一开始个人Point结构只定义带参数的构造函数,而后这句p[10001]的定义编译不过,网上查了下结构数组的定义,一大堆文章的解决方案都是定义数组的同时初始化数组,但我这里显然没办法初始化。后面想到既然没有初始化数据,那是否须要定义一个默认的无参数构造函数,果真加上以后编译经过了。rest

2.Review 阅读并点评至少一篇英文技术文章

这周阅读的文章是GameDev Protips: How To Survive As An Indie Developer,做者Daniel Doan提出,做为一个游戏独立开发者,想要在游戏行业中生存下来,须要学会如下几点:code

  1. 关注你熟悉的领域。若是你是逻辑性很强的,那就选择成为程序员,若是不擅长编码的,能够作美术,若是你熟悉财务和市场相关的知识,能够作游戏发行;
  2. 游戏尽可能简洁。一开始堆大量粗糙的功能,先不考虑可否按时完成,就算完成质量也很糟,用户体验和市场效果都很差。正确的作法是从玩家角度出发,玩家操做要尽可能简单,容易上手,这样玩家才能享受游戏的乐趣;
  3. 学会舍弃。当某些需求消耗你大量的时间、精力或者金钱,但它又不是核心的功能需求,那就有必要考虑舍弃它。由于咱们的时间、技术、金钱等资源是有限的,须要把有限的资源花在重要的需求上,这是项目管理要作的事情;
  4. 善于寻求帮助由于咱们每一个人都不是万能的,咱们有本身擅长的领域,可是还有不少其余方面的知识咱们是不懂的,这个时候就须要向外寻求帮助,把本身不擅长的部分外包出去。好比我不懂美术,能够请美术外包,我不懂推广,能够将游戏交给游戏发行公司进行推广。

3.Tip 学习至少一个技术技巧

最近开始用vscode(之前习惯用sublime),这里分享几个我以为比较经常使用的快捷键和设置吧接口

  • 在当前文件中快速定位接口的定义,Ctrl+Shift+O,而后输入关键字进行模糊搜索
  • 经过文件名快速在当前文件目录下查找该文件,Ctrl+P,而后输入文件名关键字进行模糊匹配
  • 跳转到接口的定义后,能够经过Alt+←返回,相似的,经过Alt+→往前跳转
  • 格式化代码,选中须要格式化的代码块后,Ctrl+K+F就能够
  • 修改代码Tab的缩进长度,File->Preferences->Settings,修改Commonly Used里面的Editor:Tab Size.然而有些时候修改了却没有生效,那是由于Editor:Detect Indentation被勾上了,它选中的意思是若是检测到原来代码的Tab缩进是2,就算设置了4,vscode会临时改成2,须要把这个选项去掉

4.Share 分享一篇有观点和思考的技术文章

分享一篇关于服务调用的文章
终于有人把服务调用说清楚了游戏

相关文章
相关标签/搜索