代码随想录算法训练营第二天|力扣No.59题,No.209题和No.977题

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

代码随想录算法训练营第二天|力扣No.59题,No.209题和No.977题_第1张图片

第一次拿到这道题我的想法很简单,先对数组中的所有数字取平方,然后再排序,这是一种暴力解法,时间复杂度是O(n+nlogn),没有具体写代码就略过。

看了解析之后发现可以用昨天学习过的双指针法,思路很简单,因为原数组是非递减序列,所以平方之后最大的数不是在最左就是在最右(因为该数组可能含有负数),所以我们在原数组的两侧分别设置一个指针,平方之后将两数进行比较,将更大的那个赋给新数组,由于新数组也要求非递减序列排序,所以我们将指针设置在最右,不断前移得到新数组。

代码随想录算法训练营第二天|力扣No.59题,No.209题和No.977题_第2张图片

 代码里要注意的就是malloc函数还写的不熟练,对*的使用场所也不熟练,其他还是比较容易掌握的。

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

代码随想录算法训练营第二天|力扣No.59题,No.209题和No.977题_第3张图片

本题的核心就是在不断地调节子序列的起始位置和终止位置,如果采用暴力解法,则是利用两个for循环,一个for循环表示起始位置,另一个for循环表示终止位置,代码实现感觉也很复杂,自己看解析的时候感觉没有特别理解,下附卡哥暴力解法的代码。

代码随想录算法训练营第二天|力扣No.59题,No.209题和No.977题_第4张图片

 第二种方法是滑动窗口,旨在用一个for循环完成两个for循环的操作,很显然这里循环的索引应当是终止位置。

这种方法看卡哥做的动图可以很快地理解,可以说是一目了然,下附链接:代码随想录

在本题中实现滑动窗口,主要确定如下三点:

  • 窗口内是什么?
  • 如何移动窗口的起始位置?
  • 如何移动窗口的结束位置?

窗口就是满足其和 ≥ s 的长度最小的连续子数组。

窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。【这段是直接引用了代码随想录中的原话,感觉很好地概括了滑动窗口的关键点】

因为一定要遍历整个数组才能确定最小长度,所以我们还需要不断地更新最小数组的长度。感觉这种方法和双指针也很相似,

滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。

代码随想录算法训练营第二天|力扣No.59题,No.209题和No.977题_第5张图片

对于最开始和最后minLength的取值纠结了好久,提交了好几次都在报错,感觉还需要多思考此处。

中间有一个三目运算符,下附百度出来的解释。

代码随想录算法训练营第二天|力扣No.59题,No.209题和No.977题_第6张图片

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

代码随想录算法训练营第二天|力扣No.59题,No.209题和No.977题_第7张图片

重点在于每次循环一定要坚持用同一种方式,选择左闭右开就要每一条路都是左闭右开,可以大大减少错误的机率。

说实话这个没太搞懂,过几天再看下,就不贴上写的代码了。

你可能感兴趣的:(leetcode,算法,职场和发展)