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

目录

977 有序数组的平方

思路分析:

 本题收获:

209 长度最小的子数组

思路分析:

本题收获

59. 螺旋矩阵II

数组的总结


977 有序数组的平方

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

题目要求:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

思路分析:

原数组是非递减顺序,平方之后,数组最左边的值不一定依然是最小,一种暴力解法的思路是:将原数组平方之后,再排序,这种做法就浪费了题目中的要求:非递减顺序。

进阶思路是:双指针法,类似于数学中的数轴,平方之后的最大值在两端取得,所以从使用双指针法,从左右两端开始找。

具体代码如下:

 本题收获:

这个题目对我来说是比较简单的,之前做过几次,这次比较自然的想到:双指针法,然后是完善一些具体的细节。

209 长度最小的子数组

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

题目要求:给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

思路分析:

找到连续子数组,一个新思路----- 用滑动窗口,控制好左右边界,以及当窗口内的数值达到条件时,注意一下: 这个时候推荐使用while()循环,控制右边界不动,只修左边界。

错误代码示范

 

本题收获

这个题简直让我受尽“折磨”,也让我充分的理解了 什么是“滑动窗口”,纠缠了很久。

  1. 看了代码随想录的代码之后,后面发现是自己在for()循环中,用了if-else来控制滑动窗口的边界,这种做法是当滑动窗口内的总值>=target时,右边界依然会被改变,尤其是if()中的,无法控制右边界,以及当看了“代码随想录”之后,有点醍醐灌顶的感觉,应该用while循环,来保证当滑动窗口内的值>=target 时,可以保证右边界不动,只修改左边界。自己对“滑动窗口”的理解加深了很多。
  2. 以及当使用if-else 时,正是因为自己在if()条件中无法控制右边界不变,所以right会很容易越界,这个时候已经远离了正确答案。
  3. “代码随想录”上用了Integer.MAX_VAULE;引入了一个int类型的最大值,这个最后需要去判断这个值是否发生了变化,如果这个值没有发生变化,说明nums[]数组中所有的值加起来也比target小,此时要返回0。
  4. 最后,这个题目让我很好的理解了:“滑动窗口”,可能和我自己思考很长时间也有关系,到后面我感觉自己充分理解了滑动窗口的意思,以及怎么滑动,但是没有解决的了如何保证右边界不变的情况。所以看完代码随想录之后印象深刻。

59. 螺旋矩阵II

        null

数组的总结

  1. 这次跟着训练营打卡,解决了之前的一个遗留问题:滑动窗口,今天自己充分思考了移动的过程,以及大致理解了螺旋矩阵的遍历过程,但是没有写出来代码。
  2. 再次巩固了数组的双指针使用场景和使用方法。
  3. 有待补充~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值