977.有序数组的平方
题目
题目中提到为非递减顺序排序的数组,要返回平方后的非递减顺序排序的数组,需要注意的是,由于非递减且存在负数,因此平方后的最大值就应该是两端去比较寻找,因此可以很直观地确定新的数组应该按从后往前即从大到小的顺序放入元素。
code
因为两端比较,直观采用双指针不断向中间靠拢,每次选最大的放入结果数组,判断条件是<=,因为会可能存在最后一个数字没有比较的情况。
复杂度
空间复杂度 O(n)
时间复杂度 O(n)
209.长度最小的子数组
题目
题目求满足和>=target的长度最小的连续子数组,根据示例可以看出可能有不存在的情况,且数组长度小于等于1e5,因此在起初设置最小子数组长度时可以设置一个比长度大的值,在最后返回时进行比较。
code
本题涉及连续子数组,可以使用滑动窗口,当累加值大于目标值后就去更新窗口起始位置继续滑动,直至滑到数组末尾。
滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。
复杂度
空间复杂度 O(1)
时间复杂度 O(n)
59.螺旋矩阵II
题目
本题按照题目意思直接模拟,需要注意每一次填充时都需要区间保持一致(左闭右开或左开右闭)。
code
n为奇数时,需要额外再填充一次。
本人对vector的相关操作还需要再熟悉一下。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
数组总结
定义相关
1.数组是存放在连续内存空间上的相同类型数据的集合。下标从0开始,数组声明后,对于其中的元素只能覆盖不能删除。
2.二维数组,在c++中内存地址是连续的,java则是不连续的。
3.c++的vector的底层不是直接使用简单的静态数组,在概念上可以将其视为一个封装了动态分配内存的数组,提供了一种类似于数组的接口和行为,并且在内部使用动态分配的内存来支持可变大小的数组,比如可以使用erase函数来删除某个元素。
运用相关
1.数组+有序 可以考虑二分法 时间复杂度O(logn)
2.双指针法 可以帮助将时间复杂度从暴力解法的O(n*n)降到O(n)
3.滑动窗口 一般涉及子数组 可以帮助将时间复杂度从暴力解法的O(n*n)降到O(n)
4,vector相关操作还不是很熟练(vector初始化的某一种方式)