代码随想录第二天|LeetCode 977有序数组的平方,59螺旋矩阵,209长度最小的子数组

题目链接:977. 有序数组的平方 - 力扣(Leetcode)

思路:首先想到的肯定是暴力解法,直接求出每个元素的平方,然后排序,但是题目要求时间复杂度是O(n),意思是要一次遍历完数组就能够将元素排序好,而且题目结果要求是递增的序列,那么也就表示检索到元素可能需要交换位置,但是这个操作比较占时间,并不符合,只能是想办法一次填满新数组空间,这里就有两种思路:

1.找到最小的元素,填到第一个位置,然后再找到次小的元素填到第二个位置,以此类推;

2.找到最大的元素,填到最后一个位置,然后再找次大的元素填到倒数第二个位置,以此类推;

因为初始序列是一个递增序列且可能存在负数,所以各元素平方之后,找最大值比找最小值的开销更小,所以我们可以使用双指针,指向头尾,然后比较谁更大,更大的先插入数组尾部,然后两个指针边比较边往中间移动,依次填满新数组即可;

题目链接:59. 螺旋矩阵 II - 力扣(Leetcode)

思路:要把数组填写到矩阵对应的地方,肯定是每次填写一行,一行写完之后再写下一行,例如写完第一行,就马上从最右边的列开始往下写,直到写到底部,然后如此往复。这个过程的话相当于有四个步骤,从左上往右上写,然后从右上往右下写,然后从右下往左下写,然后从左下往左上写。每次写完一排之后,下次肯定不会再继续访问了,所以肯定要做处理,每次写完一排少一排的话,很容易就会产生临界情况,然后也就结束写入了。

我们可以定义四个基础的信息,描述这个正方形的四个边,写完第一行,我们就可以iTop+1,这样下次就不会再访问到这一行,临界情况就是如果访问完当前行,然后执行iTop-1操作时出现上边界比下边界要大,则表示已经全部螺旋读完,每一个边的情况也类似,可以推理得到。

题目链接:长度最小的子数组 - 力扣(Leetcode)

思路:容易想到的是找到每一个不同的起始点开始的符合条件的子数组,找出其中最短长度的一个,需要两层循环,不过当数组过长时,时间开销比较大。

可以使用滑动窗口去解决,就是定义两个指针指向数组,快的指针向前移动,每次移动都加上当前下标对应的元素,元素和Sum大于目标值时,表示从慢指针开始到快指针这之间的子数组符合条件,就需要先记录长度,然后快指针保持不变,移动慢指针,再根据Sum的变化去移动快指针,这样的话能够保证时间复杂度是O(n)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值