目录
数组基础理论
数组是存放在连续内存空间上的相同类型数据的集合。
数组是非常基础的数据结构,考察数组的题目一般在思维上都不难,主要考察对代码的掌控能力。
其特性主要有以下两点:
1.数组的下标都是从0开始的
2.数组内存空间的地址是连续的(二维数组的内存空间不一定,看用什么编程语言)
由于特性 2. 所以我们在删除或者增添数组元素的时候就要移动其他元素的位置,即数组元素不能删除,只能覆盖。
数组经典题目(思想)
数组的题目在思想上一般比较简单,但如果想要高效,并不容易。
以下主要有四种经典类型的题目,每一类型的题目也体现了一种思想。
二分法
leetcode 704.二分查找
在二分查找中主要是遵循循环不变量原则,在循环中坚持对区间的定义,从而来处理细节,这样二分查找才能写清楚。
相关题目(leetcode):
- 35. 搜索插入位置
- 34. 在排序数组中查找元素的第一个和最后一个位置
- 69. x的平方根
- 367. 有效的完全平方数
双指针法
leetcdode 27. 移除元素
双指针法(快慢指针法):主要通过一个快指针和一个慢指针在一个for循环下完成两个for循环的工作,快指针遍历数组,慢指针保存需要的元素。一般暴力解法的时间复杂度为O(n^2),而使用双指针法可以降为O(n)。
相关题目(leetcode):
- 26. 删除排序数组中的重复项
- 283. 移动零
- 844. 比较含退格的字符串
- 977. 有序数组的平方
滑动窗口
leetcode 209. 长度最小的子数组
这一题主要体现了数组操作中的另一种思想:滑动窗口
滑动窗口的时间复杂度也是O(n)。
滑动窗口的思想,主要明确窗口的内容是什么,窗口通过起始位置的变换,达到动态更新窗口大小的效果,从而得出最小的符合条件的长度。其精髓在于根据当前子序列和其大小情况,不断调节子序列的起始位置。
相关题目(leetcode):
- 904. 水果成篮
- 76. 最小覆盖子串
模拟行为
leetcode 59. 螺旋矩阵II
这一类的题目在数组中也比较常见,不涉及什么算法,就是单纯的模拟,十分考察对代码的掌控能力,同时这一题中叶体现了循环不变量原则
相关题目(leetcode):
- 59. 螺旋矩阵