数组理论基础(C++)
数组是存放在连续内存空间上的相同类型数据的集合。
数组的元素是不能删的,只能覆盖。
C++中二维数组是连续分布的。
使用C++的话,要注意vector和array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。如果不确定元素的个数,则使用vector。
数组操作:
int arr[10]; //定义一维数组
int arr[] = {1 ,2 ,3}; //定义一维数组
int arr[10] = {}; //初始化每个元素为0
int arr[10] = {1, 2, 3}; //初始化前三个元素
int* arr = new int[10]{1, 2, 3}; //初始化前三个元素
int len = sizeof(array_name) / sizeof(DataType); //获取数组长度
arr[0] = 10; //数组元素赋值
delete arr; //删除数组
int arr[5][6]; //定义二维数组
int *arr[10]; //包含10个指向int类型指针的数组(指针数组)
int (*arr)[10]; //指向大小为10的整型数组的指针(数组指针)
int *(&arr)[10]; //a是一个数组的引用,数组包含10个指针
vector初始化:
vector<int> vec; //声明一个int型向量
vector<int> vec(10); //声明一个初始大小为10的int向量
vector<int> vec(10, 1); //声明一个初始大小为10且值都是1的向量
vector<int> tmp;
vector<int> vec(tmp); //声明并用tmp向量初始化vec向量,类似二维数组
vector<int> vec(st.begin(),st.end());//将set转化为vector
vector常见操作:
vec.push_back(3);//在数组的最后添加一个元素
vec.pop_back();//去掉数组的最后一个数据并返回该元素值
vec.insert(index, 3); //在vec[index]之前插入一个元素
vec.insert(vec.begin(), 3); //在vec开头前插入一个元素
vec.insert(vec.end(),10,100);//在vec末尾插入10个元素
vec.erase(vec.begin()+index);//删除arr[index]元素
vec.erase(vec.begin()+index1, vec.begin()+index2);//删除vec里面[index1, index2)的元素
vec.clear(); //删除vec里面的数据,但内存空间没有释放
int front = vec.front(); //获得数组头的元素
int back = vec.back(); //获得数组尾的元素
vector<int>::iterator iter;
iter = vec.begin(); //返回头元素的指针
iter = vec.end(); //返回尾元素的指针
int len = vec.size(); //返回数组的元素个数
bool isEmpty = vec.empty(); //判断vector是否为空
sort(vec.begin(),vec.end());//数组排序
704. 二分查找
题目链接:704. 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路:
我在此题使用的是左闭右闭写法。通过比较nums[middle]与target值的大小以缩小搜索区间,大于target则让right = middle-1,小于target则让left = middle+1。
时间复杂度:O(log n)
空间复杂度:O(1)
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
int middle;
while (left <= right)
{
middle = (right - left)/2 + left;
if (nums[middle] < target)
{
left = middle + 1;
}
else if (nums[middle] > target)
{
right = middle - 1;
}
else
{
return middle;
}
}
return -1;
}
};
27. 移除元素
题目链接:27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路:
双指针思想。快指针fast用来获取新数组中的元素,而慢指针slow用来获取新数组中的位置。
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.size(); fast++)
{
if (nums[fast]!= val)
{
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
};