2 数组
2.0 数组题目总结
- 快慢指针
- 一个遍历,一个指向更新位置
- 覆盖操作
- 如果可以不用在乎某些值,可以直接覆盖,而不是交换。
- 区域指针
- 对问题进行区域划分,使用不同指针指向区域的更新位置。
2.1 移动0(LC-283)
- 问题描述:给定一个数目nums,编写一个函数将所有0移动到数组末尾,同时保持非0元素的相对位置。(原地操作)
- 解题思路:双指针,快慢指针
- 快指针遍历数组,慢指针指向更新位置。(覆盖操作)
- 初始化时,快慢指针都指向0位置。
- 快指针遍历数组,当快指针指向的数不为0时,和慢指针互换,并让快指针指向下一个位置。
- 如果不含0,那么快慢指针同时会超过数组长度。
- 如果有0,那么让慢指针指向的位置及以后都赋值为0。
- 时间复杂度O(n),空间复杂度O(1)
2.2 颜色分类(LC-75)
- 问题描述:原地操作数组元素的三种颜色(红、白、蓝),使得数组中相同颜色的相邻,而且保证红、白、蓝的顺序。
- 解题思路:三指针:三个区域的划分使用:两个区域指针(left和right)+遍历指针(index)
- 移动index指针遍历,left初始指向最左边(它左边都是红色),right初始指向最右边(它右边都是蓝色)
- index遍历值:为红色则和left所指交换,为蓝色则和right所指进行交换,非两边则不动。
- 时间复杂度O(n),空间复杂度O(1)
2.3 删除有序数组中的重复项(LC-26)
- 问题描述:对升序的数组原地删除重复的元素,使得每个元素只出现一次,放回删除后数组的新长度,元素的相对顺序保持一致。
- 解题思路:双指针,快慢指针(覆盖操作)
- 快指针遍历数组,慢指针指向更新位置。
- 时间复杂度O(n),空间复杂度O(1)
2.4 合并两个有序数组(LC-88)
- 问题描述:对两个有序数组nums1和nums2进行合并,合并在nums1成为一个有序数组。假设nums1为m+n(初始有效元素为m个),nums2为n。
- 解题思路:三指针,一个遍历指针,两个位置指针。
- 遍历指针j从尾部(最大值)遍历nums2。
- 位置指针i指向nums1的有效最大尾部。位置指向cur指向nums最末端的空位置。
- 每次遍历的时候比较指针i和指针j的值:(直到j遍历完nums2)
- j大则放在cur上,并往前移动cur和j。
- i大,则移动i的值到cur,并同时往前移动i和cur。
- 相等的话可以随便写在上述任意一种情况。
- 时间复杂度O(m+n),空间复杂度O(m+n)