数组part02

2026.01.29 第二天

209 长度最小的子数组

这题使用滑动窗口进行求解,算是比较简单的。

首先最外层需要一个循环,每轮循环将窗口右边界移动一格,接着判断当前窗口中内容之和是否满足要求,也就是大于等于目标值,如果满足要求,就进行处理移动窗口左边界,使之不满足和大于等于目标值的条件(由于新加入窗口的元素可能较大,因此需要左边界移动左次才能让窗口中数的和小于目标值,所以需要使用while循环,另外需要在进while循环之后立即保存当前窗口长度,因为当while结束时,正好可以保存当前右边界条件下的最小窗口长度)。

59 螺旋矩阵 ||

循环不变量原则,非常重要,对于理清程序逻辑帮助很大。

这题首先需要发现每一圈可以由四个相同长度的左闭右开区间组成,而后由于每一圈边的长度都会减少,因此可以设置一个offset_head值来确定左边界和上边界,使用offset_tail来确定右边界和下边界,每轮循环完成相同长度的四条边的填充,同时offset都要加一;同时需要发现循环的圈数与n有关,n为偶数时圈数为n/2,为奇数时圈数为n/2+1

区间和

区间和使用前缀和思想,是一种很巧妙的方法,没有使用过的情况下很难一下子想到。

这种方法在输入数据的同时就计算出了一组数据中从第一个数据到每一位数据的累加值,想要知道一个区间内数值的和,直接将区间头尾的累计值相减即可,与生活中使用电表水表计算用电量和用水量的思想相同。保持时间复杂度为O(n)不变的情况下,增加了一点空间占用(创建了一个和输入数据同样大小的数组),实现快速求解连续数值的和。

开发商购买土地

同样使用了前缀和思想,由于只能横切或竖切,分成两块,因此只需要计算出横竖的前缀和之后遍历计算从每一个位置分割产生的土地价值差异,并记录最小值即可。

posted @ 2026-01-30 21:07  遠くの君  阅读(4)  评论(0)    收藏  举报