文章目录
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()); // 快速排序