算法训练营Day2

LeetCode977.有序数组的平方


题目条件:

有序数组,有正数负数

暴力:

遍历获取平方数组,再排序美滋滋(快排),复杂度是O(n)+O(nlogn)

双指针:复杂度O(n)

由于是平方数组,且原数组是非递减的,换句话说就是递增且可能存在连续相等的元素,那么,平方数组的最大元素无非就在原数组两端。所以就可以使用双指针,一个指向数组起始位置,一个指向数组终止位置。再来一个新数组的指针指向终止位置,用指针分别获取平方后的数值,取较大的一个放入新数组的终止位置。

img

LeetCode209.长度最小的子数组


题目条件:

有n个元素的无规则数组,要获取的是连续的子序列,返回数组长度

暴力解法:

双循环滑动窗口,滑动条件上层循环指向子序列起始位置,内层循环指向子序列终止位置,内层只要子序列之和小于等于target就会一直滑动,外层则是在获得超出或满足条件的子序列后向后滑动一位。

滑动窗口:

顾名思义,明确一个"窗口"的概念,窗口指的就是可能满足题目要求的子数组,通过改变窗口的起始和终止位置,去达到target的要求。

首先确定了for循环应该是终止窗口,原因是如果for循环作为起始窗口去滑动,很难脱离暴力解法的思考怪圈,而作为终止窗口,就要考虑以下几个问题:

窗口内是什么(上述解释)

如何移动窗口的起始位置:

当窗口已经满足要求或者总和>target了,起始位置就要往前移动了

如何移动窗口的终止位置:

for循环遍历即可

遇到的bug:

自以为严谨地加入了一个result++在终止窗口滑动之后,但其实没必要,这一步有点多余了。在while滑动起始窗口的代码中,就已经确定好了每一次滑动窗口对应的result。

最后的返回结果也忘记了数组不满足target的情况要做额外的判断。

学到的小知识:

用Interger.Max_Value来作为一个"不被修改或者赋值"的标记,去判断某个数有没有被修改过

LeetCode59.螺旋矩阵 II


思路:

关键在于保证每一次转圈,以及处理的每一条边在每次循环中的处理方式要尽可能地存在一个通解或者说公式,而达成这一条件的前提就是存在一个循环不变量。《随想录》中给出的解决方案是给定一个边界条件,左闭右开,每一圈的每条边都按照这个规则来处理。

具体的处理流程:

首先要确定转几圈(loop),找规律可得,loop = n /2。确定一个起始变量(start),然后就可以开始转圈了

按照题中要求的螺旋路线,左→右,上→下,右→左,下→上,同时坚持左闭右开的规则,从start行开始遍历,每转一圈,start就自增1,以此类推。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值