代码随想录算法训练营第二天(数组 下)

力扣题部分

209.长度最小的子数组

题目链接:. - 力扣(LeetCode)

我的思路(双指针超时):

        创造起始指针i, 长度指针t,每次t从0开始往后加直至总和sum超出target。将不为零的最小t存起来。(每次 i 更新后 t, sum 都要清零重新计算,浪费了大量时间导致数据量一大就超时)

代码实现(会超时):

85b0bd4d5a844d508867ece61116c385.png

思路(滑动窗口):

        先创造一个起始位置为i = 0,总和sum会超过target的子数组(如果创造不出来就明显return 0结束了),然后尝试舍去子数组头位置,去增加子数组末尾的元素直至总和sum再次超过target。第一次在舍去前记录子数组长度answer,若之后舍去前子数组长度更短,用新长度刷新answer的值。

代码实现:

d402038415d8445b8af8a43001fea3e1.png

59.螺旋矩阵II

题目链接:. - 力扣(LeetCode)

我的思路:

我填矩阵是按照一个规律做的,第一次从左往右执行了n次赋值,第二次,第三次各执行n-1次,第四次,第五次各执行n-2次,如图所示(以n = 6为例):

79abc1d7e87548089c1212ca57b0f821.png

图中的数字代表每个不同t状态下的赋值次数——分别是6,5,5,4,4,3,3,2,2,1,1。完全吻合我发现的规律。

代码实现:

c3a7955c318c4bd696cbfdad573a7a36.png

(本人打代码时发现力扣在执行代码时需要始终保持 a[x][y]合法,故只能采用先加减xy再赋值的方法,而这又导致a[0][0] = 1只好在循环外面了)

思路和代码(见代码随想录):

        看了一下代码随想录文章的题解,感觉差不多,就不再赘述了。

        题解链接:代码随想录

卡码网题部分

58 区间和

题目链接58. 区间和(第九期模拟笔试)

一般思路(超时):

每个位置放读取的元素,然后根据范围累加。

代码实现;

f9c98e96011a4a03975960a2b2c9dd9f.png

思路(前缀和):

        每个数组元素为前面元素的总和 (数组第一个是0,数组之后的值由前一个与读取数字相加)。通过这样的操作,能将累加求数组内元素的总和转换为两个数组元素相减确定值,大大减少时间。

代码实现;

bf88ec0018ab44b8801d9ac4ce325c83.png

44.开发商购买土地(八月三日补充)

题目链接:44. 开发商购买土地(第五期模拟笔试)

思路(前缀和):

        这道题充分展现了前缀和的高效,先分别对原来的数组(最左端的矩阵)进行横向前缀和(中间矩阵)和纵向前缀和(最右端的矩阵)

1 | 2  3                                           1  3(1 + 2)  6(3 + 3)                              1            2           3

|1  3                                            2  3(2 + 1)  6(3 + 3)                              3(1 + 2) 3(2 + 1) 6(3 + 3)

1 |2  3                                            1  3(1 + 2)  6(3 + 3)                              4(3 + 1) 5(3 + 2) 9(6 + 3)

对于中间的横向前缀和矩阵,我们对最后一列(加粗)再次前缀和得到数组 6, 12, 18。如果想计算横向切第一行(如图黑实线)的结果,直接拿得到的数组第一个元素(6)就是上面的总和,拿第最后一个元素减去第一个元素,就是下面的总和(18 - 6),计算总价值的差为12 - 6 = 6

 同理 对最右边的纵向前缀和矩阵,通过最后一行(加粗)我们也能得到数组 4, 9, 18。相似的,如果想计算纵向切第一行(如图红虚线)就将得到的数组第一个(4)和最后一个减去第一个元素(18 - 4) 计算总价值的差为14 - 4 = 8

以此类推,我们能得到任何一刀切后的总价值之差,最后得到最小值。

代码实现:

eb985f63171b49d09cd2fb7210a4946e.png

数组总结

        通过这两天对数组的学习,我掌握了二分法,双指针法,滑动窗口,解决数组模拟边界问题,前缀和等有关数组的解题算法思想。

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值