代码随想录训练营Day02:● 977.有序数组的平方 ● 209.长度最小的子数组● 59.螺旋矩阵II

977.有序数组的平方

题目建议: 本题关键在于理解双指针思想
题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html
视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep

思路

第一想法仍旧是暴力解法,先遍历数组,然后将每个数值平方加入到新数组中,然后利用冒泡排序对新数组进行排序,涉及到一个交换数字的写法
时间复杂度是O(N^2)
在这里插入图片描述
第二种靠双指针刚开始没搞懂,后来听了视频以后明白了,最开始忽略了数组是升序排列的所以平方后的数组的最大值只能在两端,所以设置双指针,判断左指针大还是右指针大,将大的一方添加到新数组的末尾
如果左指针大于右指针,则将左指针的值添加到新数组的末尾,同时将左指针自增一
如果左指针小于等于右指针,则将右指针的值添加到新数组的末尾,同时将右指针自减一
在这里插入图片描述

今日收获

掌握了双指针,此题的时间复杂度是O(N^2),虽然又用了将近一个小时,但是还是有收获的,加油!嘿嘿嘿

209.长度最小的子数组

题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

思路

刚开始的想法就是暴力求解,先遍历有没有一个数就大于等于目标值的,再遍历两个数相加大于等于目标值,以此类推,直到全部数相加大于等于目标值,但是发现太难实现,时间复杂度太高,如果数组长度太长复杂度将是n^n,一个数是O(n),两个数就是
O(N^2),三个数就是n的三次方,所以不想浪费时间了,打算直接看视频,看完视频说的暴力解法,发现自己的暴力解法太荒谬了,所以又打开了新思路,从头开始,依次对数值进行相加,就是先判断第一个数是否大于等于目标值,如果否则加上第二个数,再判断是否大于等于,依次加第三个第四个,只要子序列符合条件就更新最小子序列的长度,第一个数的所有情况判断完了,再判断第二个数的所有情况,以此类推,不断更新最小子序列的最小长度
在这里插入图片描述
在最后的return那里是从答案里学到的,因为要去区别一种情况,那就是所有数值加起来都不足目标值,所以没有符合条件的子序列,所以返回0

第二种思路还是看视频学习到的使用双指针,但是这次的双指针用for循环j控制终止位置,起始位置采用在for循环里自减的方式,例如j从0开始循环,不断的进行相加运算,这时候采用while循环去判断sum大于等于目标值,而不用if判断,因为比如1+1+1+1+1+2+6>=8,已经符合条件,同时j已经到达数组的末尾,这时候应该将起始位置向前移动,进行以下一个数字为起始的判断,如果用if,sum是没有置零的,j已经到达末尾,但是程序已经运行到j++这时候=7,所以不符合判断
而如果用while,j仍处于6就就可以实现,while循环里记得减去已经确定了的数,这样才能达到起始位置加一的效果
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

今日收获

59.螺旋矩阵II

题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/

思路

这个一点思路没有,连暴力求解都不知道咋写,所以直接看视频讲解了,看视频可知对于奇偶数来说螺旋的圈数也不同,所以需要分成奇偶两种情况判断:
对于偶数,旋转的圈数就是 n/2,首先定义两个初始变量 startx 和 starty 分别为0,定义一个变量 offset = 0,还有就是 count = 1自增表示存入二维数组的值,还有就是定义while终止条件的圈数loop=1,接下来开始进行循环非为上右下左四种方向,四种方向定义的规则是相同的,均为从头开始不算四个角的值,可以通过找规律写出四种循环赋值的 i 和 j ,结果如图所示,i 和 j 均与 n 和 offset 有关系,所以可以通过二者来表示,对于后两者情况(也就是下和左),刚开始没算好边界条件,后来通过对比得出for循环中变化的一方应该大于 startx 或者 starty,走完一圈之后必须将 startx starty offset 自增1,因为表示新的一圈开始了
对于奇数,旋转的圈数也是 n/2,但是转完完整的一圈之后,需要单独对最后的那个数赋值。后边的步骤与偶数相同即可。
在这里插入图片描述

今日收获

收获满满,双指针get!,数组的练习就到这了,需要回顾一下前边做的题!
今天真的好累!
从早上做到下午,就这么三道题做了这么久,看来做题之路,道阻且长
加油加油奥里给!!!!!!!!!!!

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值