DAY2 今天耗时约3h
977. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
上来先暴力算一下,顺便复习了一下冒泡排序
然后发现一些数值很大,数组很长的测试就过不了了
实际上一开始数据就是非递减的,有正数有负数,那么要取平方后最大的数值,要么是原数组第一个要么是最后一个,于是希望使用双指针方法
这下ok了
209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
最开始的思路想到的是动态规划(用p保存一部分计算好的子数组和)
(一开始读错题目的以为是使得子数组之和等于target)
然后发现有一个数组很长、数很大的测试用例,然后就超出时间了……
用例通过18/21
然后看视频,用滑动窗口解,先使用end指针不断前移,当sum大于target时前移start不断缩小范围找到此时最小区间
并记录这个过程中的最小窗口值
这个方法效率为O(n),两个指针各遍历一次就可以完成,sum的值也在动态变化不额外空间进行保存
59. 螺旋矩阵 II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
实际上是每一圈一次的循环,只要手动模拟一次,认真判断边界条件即可通过
(第一次一遍过,很开心)
数组总结
这两天遇到的题目
- 二分法。最重要是弄清区间的思想,区间的定义能够影响到最后的输出。在相关题目中,出现【有序】数组,可以考虑二分方法。
- 双指针法。删除注定元素、重复元素可以使用。可以认为是通过建立了两个指针在原地对数据进行了一次【原地更新】来达成目的。
- 滑动窗口。题目都与查找一个符合某种条件的【最短子序列】相关。处理数据的方式有点像管道,一边进来一边出去
- 行为模拟。找到拆分成的最小问题,然后手动模拟一次,来更好地确定正确的循环控制条件。
自己的小结
发现很多时候被问题卡住都是因为边界条件没有控制好,然后就开始缝缝补补,尤其是在考虑数组问题的时候(只有一个数怎么办,超出范围怎么办……)出现了很多问题想得头大。但实际上真正能解决问题的方法一定是普遍的不需要缝缝补补太多的。缕清思路才是关键。