(1)数组 Array 初识

1、简介


简单记录在使用Leetcode过程中遇到的数据结构与算法,常用C++与Python,故记录一下常用的操作命令。


2、数组的基本概念


定义

  • 连续的内存空间,存储相同类型的元素

特点

  • 数组下标都是从0开始的。
  • 数组内存空间的地址是连续的
  • 适合读取,不适合写入
  • 可以记为读多写少

元素与索引

  • 索引是数组内元素相对于第一个元素的位置

访问与搜索

  • 访问(Access):通过索引访问元素
  • 搜索(Search):在数组中查找这个元素,返回索引值

4个时间复杂度

(1)访问O(1)

  • 存储数据的类型已知,只需要通过数学公式计算(0索引的地址+访问目标索引*数据长度(同一类型)),即可访问,时间复杂度为O(1)
  • 例如对于int数组a,假设其0索引的地址为100,要访问索引为2的目标,即a[2],那么通过公式可以得到其地址为100+2*4=108

(2)搜索O(N)

  • 最坏从头遍历到尾才返回数组的索引,为O(N)

(3)插入O(N)

  • 插入最坏是插入在数组的头部,因此所有的数据都往后移,为O(N)

(4)删除O(N)

  • 时间复杂度同插入。

3、常用操作


  • 1、创建数组
  • 2、添加元素
  • 3、访问元素
  • 4、更新元素
  • 5、删除元素
  • 6、遍历数组
  • 7、查找元素
  • 8、数组的长度
  • 9、数组排序(内置的排序方法)

Python数组(List)

1、创建数组

# Create an array
a = []

2、添加元素

# Add element
# (1) 数组末尾直接添加元素
# Time complexiyt:O(1)
a.append(1)
a.append(2)
a.append(3)
# [1,2,3]
print(a)

# (2) 在数组内部插入元素
# Time complexiyt:O(N)
a.insert(2,99)
# [1,2,99,3]
print(a)

3、访问元素 —— 用索引(下标)来访问元素

# Access element
# Time complexiyt:O(1)

temp = a[2]
# 99
print(temp)

4、更新元素

# Update element
# Time complexiyt:O(1)

a[2] = 88
# [1,2,88,3]
print(a)

5、删除元素(3种方法)

# Remove element
# Time complexiyt:O(N)

# (1) 输入的是值
a.remove(88) 
# [1,2,3]
print(a)

# (2) 输入的是索引
a.pop(1)
# [1,3]
print(a)

# (3) 索引为空则移出最后一个元素
a.pop() 
# [1]
print(a)

6、获取数组长度

# Get array size
# Time complexiyt:O(1)

a = [1,2,3]
size = len(a)
# 3
print(size)

7、遍历数组(3种方法)

# Iterate array
# Time complexiyt:O(N)
# (1)只返回值,(2)(3)还会返回索引,因此取决于题目要求

# (1)
for i in a:
    print(i)

# (2)
for index, element in enumerate(a):
    print("Index at", index, "is:", element)

# (3)
for i in range(0, len(a)):
    print("i:", i, "element:", a[i])

8、查找某个元素

# Find an element
# Time complexiyt:O(N)
# 查找2这个元素对应的索引

index = a.index(2)
# 1 
print(index)

9、数组排序

# Sort an array
# Time complexiyt:O(NlogN)

# From small to big
a = [3,1,2]
a.sort()
# [1,2,3]
print(a)

# From big to small
a.sort(reverse=True)
# [3,2,1]
print(a)

C++数组(vector)

0、vector常用函数汇总

  • push_back 在数组的最后添加一个数据
  • insert 增加
  • pop_back 去掉数组的最后一个数据
  • clear 清空当前的vector
  • erase 删除
  • at 得到编号位置的数据
  • front 得到数组头的引用 (begin、end返回的是指针)
  • back 得到数组的最后一个单元的引用
  • begin 返回第一个元素的指针
  • end 返回最后一个元素的指针
  • size 当前使用数据的大小
  • max_size 最大可允许的vector元素数量值
  • capacity vector实际能容纳的大小
  • empty 判断vector是否为空
  • swap 交换
  • assign 使用括号内的值设置当前的vector

1、创建数组

  vector<int> vec;        //声明一个int型向量
  vector<int> vec(5);     //声明一个初始大小为5的int向量
  vector<int> vec(10, 1); //声明一个初始大小为10且值都是1的向量
  
  vector<int> tmp;
  vector<int> vec(tmp);   //声明并用tmp向量初始化vec向量
  
  vector<int> tmp(vec.begin(), vec.begin() + 3);  //用向量vec的第0个到第2个值初始化tmp

2、添加元素

  • push_back()

  • insert()

    //使用push_back():
    vector<int> arr;
    for (int i = 0; i < 10; i++){
    	arr.push_back(i);
    }
    
    //使用insert()
    arr.insert(arr.begin(),8);  //在最前面插入新元素。  
    arr.insert(arr.begin()+2,1);//在迭代器中第二个元素前插入新元素  
    
    arr.insert(arr.end(),3,1);//在迭代器的最后一个元素后增加3个1
    
    arr.insert(arr.end(),arr2.begin(),arr2.end());//在迭代器的最后一个元素后增加arr2中的数据
    
    

3、访问元素

  // 与Python类似
  temp = arr[2];
// 99
cout << temp << endl;

4、更新元素

  arr[2] = 88;
// [1,2,88,3]
cout << arr[2] << endl;

5、删除元素

  • pop_back()

  • erase()

  • clear() —— 只能清除vector里面的数据,但是内存空间没有释放,如果要释放内存空间,使用arr.swap(vector ());

    //使用pop_back()
    arr.pop_back();
    
    //使用erase()
    arr.erase(arr.begin()+3); //删除第3位元素
    arr.erase(arr.begin()+2,arr.begin()+4); //删除arr里面[2,3)的元素(删除第2个元素)
    
    //使用clear()
    arr.clear();
    

6、遍历数组

  • at()

  • front()

  • back()

  • begin()

  • end()

    //使用at()
    arr.at(3);   //vector中第三位的数值
    
    //使用front()和back()
    int front = arr.front();
    int back = arr.back();
    
    //使用begin()和end()
    vector<int>::iterator iter;
    iter = arr.begin()+4;
    cout << *iter << endl;
    
    //使用begin()实现遍历
    for(vector<int>::iterator iter=arr.begin();iter!=arr.end();++iter){
    	cout<<" "<<*iter;
    }
    
    

7、数组的长度

  • size() vector中元素的个数

  • capacity() vector实际能容纳的大小

  • max_size() 最大可允许的vector元素数量值

    int size = arr.size();
    int cap = arr.capacity();
    int max = arr.max_size();
    

8、数组排序

 sort(arr.begin(), arr.end()); // 快速排序

4、参考资料


手把手带你刷Leetcode力扣
【C++】数组及基本操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值