977.有序数组的平方
C
- 自己的思路:找到最接近0的位置,然后向左右寻找,谁的平方小放前面,直到俩边都到达末尾。
观看官方题解后,更加清晰的描述是:寻找到正数和负数的分界线
int negative = -1; for (int i = 0; i < numsSize; i++){ if (nums[i] > 0){ negative = i; break; } }
或者直接全部平方,然后再排序。这是可预测的n+nlogn
- 看题解补充的思路,直接使用双指针,一个放在头,一个在尾,直接进行比较,比自己的第一个思路更优雅,时间复杂度是可O(n),返回了新的数组,空间复杂度是O(n)
实现成功
202 长度最小的子数组
C
- 自己的思路:使用俩个指针,俩个从头开始,快指针向后探索尝试寻找一个组合,计算经过的数字和,如果达到末尾,那么回到慢指针处,俩个一起向后移动一格。 如果有多个结果,使用一个变量储存,更小就存入,否则丢弃。最后检测这个变量,初始值可以设为-1;
这里的最坏结果就是每次都需要探索到最后,时间复杂度是O(nn),没有使用额外堆空间
第一次的代码没有考虑到数组最后有符合的,直接被丢弃了
之后又再次失败,被用例[ targer = 11; [1, 2, 3, 4, 5] ] * 原来是题目描述没看清,大于目标值也行
好,暴力法完成了,但是完美的超时。官方也超时,这种方法是不推荐的
- 看过滑动窗口的思路: 先将快指针移动到和大于或等于目标值的位置,此时得到第一个子数组。之后将慢指针向右移动开启下一次寻找。最后变量中会记录经历的最小数组
成功完成。这个过程理清了,编写的难度不高
- 官方的第三种解法:使用了一个额外的数组来存储前缀和,模模糊湖,先放一边
59 螺旋矩阵||
C
能想象填的顺序但是没法实现,直接看题解;
学会了动态的分配二维数组
手打一遍
看视频真的挺好的,能跟着思考。