(本文的图均引用自代码随想录)
数组理论基础
1、数组是存放在连续内存空间上的相同类型数据的集合
2、
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的
因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
但是数组的元素是不能删除,只能覆盖的
同时学会了创建数组的语法 Vector<int> 名字(长度,数值);
二维数组只需要将数值再嵌套一层即可
3、二维数组在内存空间中是连续的(C++)
4、
- 数组在内存中是连续的地址空间,不能释放单一元素,如果要释放,就是全释放(程序运行结束,回收内存栈空间)。
- C++中vector和array的区别,vector的底层实现是array
这章学到的方法
1、二分法
时间复杂度:O(n)
主要的是一个循环不变量原则,对于之后每次边界的处理是保持一致的,同时二分法有两种写法,例如左闭右闭,左开右开,具体的写法可以参考这篇我写的总结,同时其中二分法的对于mid元素的取等,可以做到最大化搜索和最小化搜索,也就是找到第一个大于等于target的元素,和找到最后一个小于等于target的值,以及其中具体的下标计算,均在下方的博客中提及
代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素-CSDN博客
2、双指针法
时间复杂度:O(n)
通过快慢指针来移除元素,一个是寻找新的数组元素填入,一个是记录当前的下标,用一个for循环就可以做两个for循环的事,具体的可以看下方博客,同时第二天的有序数组平方和,也是利用了双指针法的思想,通过一个头指针,一个尾指针来寻找最大的数,并从尾填入新数组
具体的总结和题目可以看下方的博客:
代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素-CSDN博客
代码随想录算法训练营第二天 | 977.有序数组的平方、209.长度最小的子数组、 59.螺旋矩阵II-CSDN博客
3、滑动窗口
时间复杂度:O(n)
通过一个动态变化的窗口,可以避免对于所有情况的遍历,其中比较巧妙的是j是作为终止位置去扩大窗口满足条件,在这个循环中,如果一旦发现了满足条件的数组,便可以移动初始位置i,来缩减这个数组,以此来寻找最小的子数组,这是后往前的思想,具体的题目和总结看上方第二天的博客
4、模拟行为
这个是比较常见的一种行为,在螺旋矩阵这个题目中,我们模拟的是一个矩阵的构造,就是一条一条边的写,具体代码和总结在第二天的博客中,其中也是很巧妙的运用了循环不变量的原则