【阅读与算法】摘录&螺旋矩阵 II

摘录

心理学也许是现代生活中人们最广泛涉及的主题,因为,其实人的生活首先也主要是由人的心理与行为支撑的。无论生活中的衣食住行,还是工作中的为人处世,都离不开心理学,都需要心理学的知识和帮助。

心理学的目标:在适宜的水平上客观地描述行为、解释行为产生的原因、预测将要发生的事情、控制行为改进生活质量

  • 遗憾的是,即便学科与生活息息相关,人们也不一定会去关注。
  • 可能是学科门槛高,书籍难懂,课程无聊,宣传不足,存在偏见等。于是一些简便高效又简单易懂的学习方式或工具值得被开发出来。
  • 也可能是个人原因,通常要让衣食住行健康安全等基本需求得到满足后,才有余裕去扩充精神需求。但精神需求受多方面因素的影响,最终选择个体更高生活质量的似乎比选择研究学科知识改善整体质量的多些。当然,如果有足够的能力和资源,可以选择全都要,那就更好了。
  • 或许,关注方式不仅有学习研究,还能是咨询委托,就像发生法律纠纷,通常会去请律师解决,而不需要自己查找法律条文,研究司法解释。这种方式的前提是能请到值得信赖的咨询委托对象。

螺旋矩阵 II

  • 方法:双指针(水平指针与垂直指针)
  • 过程:


    螺旋矩阵2
  • 思路:设置水平指针j与垂直指针i。在进行上右下左遍历的时候,使用循环不变量原则,坚持选取左开右闭的区间,到达边界就切换指针遍历,然后发现如果n为奇数,会有一个正中间的值,该值不会被上述上右下左结合左开右闭的方式遍历到,所以需要特殊处理。考虑到遍历次数都为n*n次,可以用计数的方式作循环的终止条件。然后根据上述过程图写出基本核心代码,通过简单实例得出边界条件,最后用更多的实例验证,完善考虑不周到的地方,直到通过检测。
  • 代码
vector> generateMatrix(int n) {
    vector> result(n, vector(n, 0));
    int total = n * n; // 总数
    int num = 1; // 计数
    // 行与列,从1开始,所以result[i - 1][j - 1]
    int i = 1;
    int j = 1;
    int level = 0; // 层数
    // 上右下左遍历都取左闭右开区间。如果n为奇数,需要先处理中间位置,然后只遍历四周
    if (n % 2) {
        int mid = n / 2;
        result[mid][mid] = total;
        total--;
    }
    while (num <= total) {
        // 上
        j = level + 1;
        while (j < n - level && num <= total) {
            result[i - 1][j - 1] = num;
            num++;
            j++;
        }
        // 右
        while (i < n - level && num <= total) {
            result[i - 1][j - 1] = num;
            num++;
            i++;
        }
        level++;
        // 下
        while (j > level && num <= total) {
            result[i - 1][j - 1] = num;
            num++;
            j--;
        }
        // 左
        while (i > level && num <= total) {
            result[i - 1][j - 1] = num;
            num++;
            i--;
        }
        i++;
    }
    return result;
}
  • 特殊情况分析:n为1 正常
  • 时间复杂度:一共进行n*n次遍历,O(n^2)
  • 空间复杂度:O(n^2)

你可能感兴趣的:(【阅读与算法】摘录&螺旋矩阵 II)