数组真的有那么简单吗?

数组作为数据结构中最简单最常用的数据结构,很值得学习一下,本文将从数组的概念,数组的特点,数组的优缺点,数组的代码实现详细讲解数组相关知识,在文章的最后也列举了一些经典的数组算法题,可以作为材料学习。

1. 数组的概念

C语言中,一组数据的集合称为数组。比如我们知道的字符串string就属于一个字符数组,只不过在数组的尾部加了个'\0'。

2. 数组的特点

  • 内存连续
  • 数据类型一致

3. 数组的优缺点

  • 优点
    • 内存连续,支持随机访问,时间复杂度为O(1)
    • 缓存命中率高,按存储顺序访问效率高
  • 缺点
    • 内存连续,非末尾增删慢,时间复杂度为O(n)
    • 静态数组容易不好控制大小,动态数组扩容开销太大

4. 数组的代码实现

#include <iostream>
#include <cstring>
#include <stdlib.h> // 产生伪随机数
#include <time.h> // 伪随机数变真随机数
using namespace std;


class Array
{
public:
    Array(int size = 10):mCur{0},mCap{size}
    {
        mpArr = new int[mCap]();
    }
    ~Array()
    {
        delete[]mpArr;
        mpArr = nullptr;
    }
public:
    // 末尾增加元素
    void push_back(int val)
    {
        if(mCur == mCap)
        {
            expand(2*mCap); // O(n)
        }
        mpArr[mCur++] = val; // O(1)
    }
    // 末尾删除元素
    void pop_back()
    {
        if(mCur == 0)
        {
            return;
        }
        mCur--; // O(1)
    }
    // 按位置增加元素
    void insert(int pos,int val)
    {
        if(pos < 0||pos > mCur)
        {
            return; // throw "pos invalid";
        }
        if(mCur == mCap)
        {
            expand(2*mCap);
        }
        // 移动元素 O(n)
        for(int i = mCur - 1;i>=pos;i--)
        {
            mpArr[i+1] = mpArr[i];
        }
        mpArr[pos] = val;
        mCur++;
    }
    // 按位置删除
    void erase(int pos)
    {
        if(pos < 0||pos >= mCur)
        {
            return;
        }
        // O(n)
        for(int i = pos + 1;i < mCur;i++)
        {
            mpArr[i - 1] = mpArr[i];
        }
        mCur--;
    }
    // 元素查询
    int find(int val)
    {
        for(int i = 0; i < mCur;i++)
        {
            if(mpArr[i] == val)
            {
                return i;
            }
        }
        return -1;
    }
    void show() const
    {
        for(int i = 0; i < mCur;i++)
        {
            cout << mpArr[i] << " ";
        }
        cout << endl;
    }

private:
    void expand(int size)
    {
        int *p = new int[size];
        memcpy(p,mpArr,sizeof(int)*mCap);
        delete[]mpArr;
        mpArr = p;
        mCap = size;
    }
private:
    int *mpArr; // 指向可扩容的数组内存
    int mCap; // 数组的容量
    int mCur; // 数组有效元素个数
};

int main()
{
    cout << "1" << endl;
    Array arr;

    srand(time(0));

    for(int i = 0; i < 10; i++)
    {
        arr.push_back(rand()%100);
    }

    arr.show();
    arr.pop_back();
    arr.show();

    arr.insert(0,100);
    arr.show();

    arr.insert(10,200);
    arr.show();

    int pos = arr.find(100);
    if(pos != -1)
    {
        arr.erase(pos);
        arr.show();
    }

}

1. 两数之和 - 力扣(LeetCode)

39. 组合总和 - 力扣(LeetCode)

64. 最小路径和 - 力扣(LeetCode)

704. 二分查找 - 力扣(LeetCode)

64. 最小路径和 - 力扣(LeetCode)

27. 移除元素 - 力扣(LeetCode)

209. 长度最小的子数组 - 力扣(LeetCode)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值