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

顺序表

顺序表,说白了,就是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个数据空间。

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

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

结语

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

相关推荐
️是784 小时前
信息奥赛一本通—编程启蒙(3395:练68.3 车牌问题)
数据结构·c++·算法
故事和你916 小时前
洛谷-【图论2-1】树5
开发语言·数据结构·c++·算法·动态规划·图论
paeamecium6 小时前
【PAT甲级真题】- String Subtraction (20)
数据结构·c++·算法·pat考试·pat
-To be number.wan9 小时前
为什么关系数据库主要采用b+树、散列表来构建索引
数据结构·b树·散列表·数据库系统
澈2079 小时前
滑动窗口算法:双指针高效解题秘籍
数据结构·c++·算法
如竟没有火炬9 小时前
字符串相乘——int数组转字符串
开发语言·数据结构·python·算法·leetcode·深度优先
pluviophile_s11 小时前
数据结构:第1讲:算法分析
数据结构·笔记
白藏y11 小时前
【数据结构】简单选择排序
数据结构·算法·排序算法
信奥胡老师11 小时前
B3930 [GESP202312 五级] 烹饪问题
开发语言·数据结构·c++·学习·算法
paeamecium11 小时前
【PAT甲级真题】- Shortest Distance (20)
数据结构·c++·算法·pat考试·pat