快速复习之数据结构篇——顺序表

顺序表

顺序表,说白了,就是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. 删除排序数组中的重复项。

26. 删除有序数组中的重复项 - 力扣(LeetCode)https://leetcode.cn/problems/remove-duplicates-from-sorted-array/submissions/721235212/

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 顺序表的问题及思考

缺点。
  1. 中间/头部的插入删除,时间复杂度为O(N)

  2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。

  3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们 再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

思考:如何解决以上问题呢?

接下来有请"链表"闪亮登场!!!!!!!!!!

结语

感谢你看到这里!也欢迎订阅我的**「快速复习」专栏!**

相关推荐
RH2312112 小时前
2026.4.26数据结构 链地址法
数据结构
凯瑟琳.奥古斯特2 小时前
常见排序算法性能对比
数据结构·算法·排序算法
gumichef15 小时前
算法的时间复杂度和空间复杂度
数据结构
cpp_250116 小时前
P1832 A+B Problem(再升级)
数据结构·c++·算法·动态规划·题解·洛谷·背包dp
꧁细听勿语情꧂16 小时前
合并两个有序表、判断链表的回文结构、相交链表、环的链表一和二
c语言·开发语言·数据结构·算法
大肥羊学校懒羊羊16 小时前
完数与盈数的计算题解
数据结构·c++·算法
无限进步_19 小时前
C++ 继承机制完全解析:从基础原理到菱形继承问题
java·开发语言·数据结构·c++·vscode·后端·算法
不知名的忻19 小时前
并查集(QuickUnion)
java·数据结构·算法·并查集
数智化精益手记局19 小时前
仓库安灯管理系统的异常响应机制:破解仓库安灯管理系统的跨部门协同难题
大数据·数据结构·人工智能·制造·精益工程