1. 螺旋矩阵
这题的思路其实挺直观的,就是控制上下左右四个边界,一圈一圈地往里收缩。
具体做法:
1.先从左往右,把当前最上面一行加进去,然后 top 往下移动。
2.再从上往下,把当前最右边一列加进去,然后 right 往左移动。
3.接着从右往左,把当前最下面一行加进去,然后 bottom 往上移动。
4.最后从下往上,把当前最左边一列加进去,然后 left 往右移动。
这里有两个坑需要注意:
从右往左 和 从下往上 之前,要先判断当前的行数或列数是否还够用,否则可能会重复遍历或者越界。收缩顺序不能乱,每收缩一步都要更新对应的边界。这样一圈圈收下去,就能把矩阵按螺旋顺序遍历出来。
2. 区间和
区间和这类题,前缀和是神器。
我的做法是先建两个数组:
第一个数组是原始数据 vec。
第二个数组是累加和数组 p,其中 p[i] 表示 vec[0] 到 vec[i] 的和。
有了 p 之后,要求任意区间 [a, b] 的和,只要用:
p[b] - p[a-1] # a > 0
p[b] # a == 0
就能 O(1) 得到答案,比每次循环累加快多了。
3. 开发商购买土地
这题和区间和的思路挺像,但换成了二维版本。
做法是这样的:
先算出矩阵的总和 sum。
再分别算出每一行的总和(横向统计)和每一列的总和(纵向统计)。
枚举所有可能的切割位置:
横切:从上往下累加行和,计算两边差值。
竖切:从左往右累加列和,计算两边差值。
取所有差值的最小值,就是最优切法。