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

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

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

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

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

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

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

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

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

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第二十二天的算法训练营主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组平方",和Leetcode 209 "长度最小数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小数组

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值