顺序表

顺序表,说白了,就是NB亿点的数组。
它最重要的特点,可以通过下标快速访问。增删改查非常方便。
2.1概念及结构
顺序表是用一段物理地址连续 的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改。
顺序表一般可以分为:静态顺序表,动态顺序表(主要)。
1. 静态顺序表:使用定长数组存储元素(拉完了,了解即可)
2. 动态顺序表:使用动态开辟的数组存储。
2 接口(顺序表里面不仅仅只能存int哦,能存所有数据类型包括自定义类型)
vector 就是 C++ 官方写好的,接口超简洁的动态顺序表
- 尾插 →
push_back - 尾删 →
pop_back - 任意位置插入 →
insert - 任意位置删除 →
erase - 判空 / 大小 / 扩容 →
empty()/size()/reserve() - 访问元素 →
[]/front()/back() - 清空 →
clear()
2.3 顺序表相关面试题
1. 原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。
27. 移除元素 - 力扣(LeetCode)
https://leetcode.cn/problems/remove-element/description/
cpp
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
// 双指针法:原地移除,O(n)时间,O(1)空间
// pre:慢指针,记录非val元素的存放位置
// cur:快指针,遍历整个数组
int pre = -1;
int cur = 0;
while(cur < nums.size())
{
// 当前元素不等于val,需要保留
if(nums[cur] != val)
nums[++pre] = nums[cur]; // 放到pre的下一个位置
cur++; // 快指针始终前进
}
// pre是最后一个非val元素的下标,元素个数为pre+1
return pre + 1;
}
};
2. 删除排序数组中的重复项。
cpp
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
// 有序数组去重,双指针法(原地修改,O(n)时间,O(1)空间)
// pre:慢指针,记录下一个不重复元素的存放位置(首元素默认保留,从1开始)
// cur:快指针,遍历数组(从1开始,和前一个元素比较)
int pre=1;
int cur=1;
while(cur<nums.size())
{
// 有序数组中重复元素相邻,和前一个元素不相等则为新元素
if(nums[cur]!=nums[cur-1])
nums[pre++]=nums[cur]; // 存放到pre位置,pre后移
cur++; // 快指针始终前进
}
return pre; // pre的值就是不重复元素的个数(前pre个元素有效)
}
};
3. 合并两个有序数组。 OJ链接
88. 合并两个有序数组 - 力扣(LeetCode)
https://leetcode.cn/problems/merge-sorted-array/
cpp
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
// 双指针从后往前合并,原地修改nums1,避免覆盖nums1的有效元素
int p1 = m - 1; // nums1有效元素的末尾下标
int p2 = n - 1; // nums2的末尾下标
int cur = m + n - 1; // 合并后nums1的末尾下标(从后往前填充)
while(cur >= 0)
{
if(p2 < 0) break; // nums2已全部合并,直接结束
if(p1 < 0) // nums1已用完,直接复制nums2剩余元素
{
while(cur >= 0)
nums1[cur--] = nums2[p2--];
break;
}
// 取较大的元素放到cur位置,对应指针前移
if(nums1[p1] > nums2[p2])
nums1[cur--] = nums1[p1--];
else
nums1[cur--] = nums2[p2--];
}
}
};
2.4 顺序表的问题及思考
缺点。
-
中间/头部的插入删除,时间复杂度为O(N)
-
增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
-
增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们 再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。
思考:如何解决以上问题呢?
接下来有请"链表"闪亮登场!!!!!!!!!!
结语
感谢你看到这里!也欢迎订阅我的**「快速复习」专栏!**
