看到题目首先想试试暴力法,即挨个平方在排序
然后再想如果按照双指针来解决这个问题,然后发现没什么头绪,遂看视频,视频链接如下:
双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili
然后发现这个方法好巧妙通过左右两端比较大小的方式来依次拿出最大的数
这道题对于我这种新手来讲就比较头疼,没思路遂看看卡尔的视频,然后先自己尝试用暴力破解法来解决试试, 果不其然,超时力。
然后再去看视频,学习非常生疏且头疼的滑动窗口,视频链接如下:
拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili
看完后领悟了不少细节 按照视频的思路删删改改通过了
滑动窗口总结
这节视频真的让我领悟了不少细节,滑动窗口就是在暴力法的基础上用一个循环来解决问题
1 指针right指向的是滑动窗口的终止位置, 决定起始位置的移动是解决滑动窗口问题的精华所在
2 具体地说,当滑动窗口内所有元素和大于目标值时再移动left,然后不断的更新窗口内的最小值,直到循环结束即right = len(nums)
其他细节
滑动窗口长度应该为 right - left + 1,别忘了加一
left 向后移动时,不要忘了区间和减去当前的nums[left],否则会陷入死循环超时
当 判断cursum >= targets 时 应使用while 而不是if 在代码随想录视频里举了 [1,1,1,1,1,1,100]这个例子,如果使用if 就不能得到正确的答案了,这个问题是我之前从未想过的。
这道题一出来人就懵了,由于之前基本没有做过矩阵相关的题目,导致做这种题目相当的难受,对于如何控制循环和变量完全没有清晰的逻辑,于是直接看视频学习。
一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili
看了4遍视频后,自己痛苦的尝试,定义循环不变量后开始从左到右,从上到下,从右到左,从下到上填数,又错了几次,然后自己在纸上画图来纠错,这道题花费了近一个小时,终于通过了
相关细节
需要总结的细节感觉还是非常多的,做矩阵的题目感觉都非常绕,非常容易出错,譬如需要定义mid,当n为奇数时,需要给mid填上数字;循环不变量offsite区间为(1,loop+1)也很重要,开始还迷惑为啥要这么设置,后面出错后才明白是用来规范左开右闭区间的。这道题感觉还是要在纸上画图才行,尤其是确定内部循环的时候。