数组
数组、集合、列表
集合:由一个或多个元素所构成的整体,其特性在于元素类型不一定相同,其中的元素没有顺序。事实上,这样的集合并不直接存在于编程语言中。然而,实际编程语言中的很多数据结构,就是在集合的基础上添加了一些规则形成的。
列表:数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合。它具有顺序,且长度是可变的。在编程语言中,常见的列表形式有数组和链表,栈和队列是两种特殊的列表。
数组:列表没有索引,数组有索引。数组在内存中连续存储,列表不一定(例如链表)
数组常见操作
读取元素:时间复杂度O(1), 索引N地址 = 索引0地址+N
查找元素:时间复杂度O(n), (查找是想知道在数组中是否存在某个元素,读取则是提供索引访问)
插入元素:时间复杂度O(n), 插入后需后移后继元素
删除元素:时间复杂度O(n), 删除后需前移后继元素
练习
以下习题并无所谓技巧可言,按照正常的思路解决即可
1. 寻找数组的中心索引
题目链接: 724.寻找数组的中心索引.
解题思路:遍历数组求和,再次遍历用一个全局变量记录每个元素的前缀和,再判断更新。
代码:
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int sum = 0;
for(auto it = nums.begin(); it < nums.end(); ++it){
sum += *it;
}
int standard = 0;
for(int i = 0; i < nums.size(); ++i){
if(2*standard == sum-nums[i]){
return i;
}
standard += nums[i];
}
return -1;
}
};
2. 搜索插入位置
题目链接: 35.搜索插入位置.
解题思路:不用怀疑,直接二分搜索
代码:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0, right = nums.size()-1, ans = nums.size();
while(left <= right){
int mid = ((right-left )/2) + left;
if(target <= nums[mid]){
ans = mid;
right = mid-1;
}
else{
left = mid + 1;
}
}
return ans;
}
};
3. 合并区间
题目链接: 56.合并区间.
解题思路:正常思路,排序后遍历比较具体的某元素right与下一个元素left之间的关系
代码:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if(intervals.size() == 0) return {
};
<