代码随想录算法训练营第一天 | 977.有序数组的平方 、 209.长度最小的子数组 、 59.螺旋矩阵II

代码随想录算法训练营第一天 | 977.有序数组的平方 、 209.长度最小的子数组 、 59.螺旋矩阵II

前言

做完三道算法题 并观看视频和文章进行深度学习, 进行总结数组

一、977.有序数组的平方

题目建议本题关键在于理解双指针思想
视频链接
题目链接
文章链接
暴力解法:利用循环加 sort方法进行解题 时间复杂度:O(n + nlogn)
双指针法
思路:数组其实是有序的, 只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。此时可以考虑双指针法了,i指向起始位置,j指向终止位置。
如图所示:
双指针法解题
时间复杂度: O(n)
第一印象 看到题目第一时间想到的是用双循环 加 冒泡排序的办法…不得不说 还需要提升自己的技术和知识
学习过程看完文章第一时间还有些一知半解,看完视频后基本能够手敲出完整代码
收获进一步加强了双指针法的应用方法

二、209.长度最小的子数组

题目建议本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。
题目链接
文章链接
视频链接
暴力解法这道题目暴力解法当然是 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。

  var minSubArrayLen = function (target, nums) {
      let res = Infinity
      let sum
      let len = 0
      let num = nums.length
      for (let end = 0; end <= num; end++) {
        sum = 0
        for (let j = end; j <= num; j++) {
          sum += nums[j]
          if (sum >= target) {
            // console.log(j)
            len = j - end + 1
            res = res < len ? res : len
            // console.log(res)
            break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
          }
          // console.log(sum)
        }
      }
      return res === Infinity ? 0 : res

    }

暴力解法在力扣上已经超时了…
滑动窗口法
思路:所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。
如图所示:
在这里插入图片描述
实现困难初次接触 只看文章确实有些茫然 需要配合视频一起学习。
收获本质还是配合双指针法 进行进一步的学习 逐渐掌握。
相关题目推荐 904.水果成篮 76.最小覆盖子串

三、59.螺旋矩阵II

题目建议 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
题目链接
文章链接
视频链接
思路:大家还记得我们在这篇文章数组:每次遇到二分法,都是一看就会,一写就废 (opens new window)中讲解了二分法,提到如果要写出正确的二分法一定要坚持循环不变量原则。而求解本题依然是要坚持循环不变量原则。
模拟顺时针画矩阵的过程:
填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
第一印象第一次遇到这种类似画图填充的题目 还有点懵。
收获经过视频和文章的学习后发现 只要能够掌握二分查找 和 区间定义 实现这道题并不困难

总结

数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力。两天学习了四种数组的解题方式,再进行深度复习,相信技术会越来越好!继续加油

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值