引用说明
文档讲解:代码随想录
vector引用参考:c++ vector详解-CSDN博客
数组理论基础
-
数组下标都是从0开始的
-
数组内存空间的地址是连续的
-
1.我们在删除或者增添元素的时候,就难免要移动其他元素的地址。使用C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。
-
2.数组的元素是不能删的,只能覆盖。
Vector用法
注意:
由于vector是标准库中的类,在使用vector的时候我们需要包含标准库的头文件 < vector >
-
初始化
vector<int> vec1; //空的整形vector,我们没有给他添加任何元素。 vector<float> vec2(3); //初始化了一个有3个元素的vector,并没有指定初始值 vector<char> vec3(3,'a'); //初始化含有3个a的字符vector,第二个值代表着所有元素的指定值。 vector<char> vec4(vec3); //vector通过拷贝vec3中的元素初始化vec4,它们的元素会一模一样。
-
遍历
for (int i = 0; i < vec1.size(); i++ ) { cout << vec1[i] << ""; }
-
添加
//empty()可以判断vector是否为空,而push_back()每次会添加一个元素到vector的末尾,因此打印的时候会先打印第一个元素。 #include<iostream> #include<vector> using namespace std; //向vector添加元素 int main() { vector<int> vec1; if ( vec1.empty() ) { cout << "vec1 is empty!" << endl; } vec1.push_back(1); vec1.push_back(2); if ( vec1.empty() ) { cout << "vec1 is empty! " << endl; } for (int i = 0;i < vec1.size(); i++ ) { cout << vec1[i] << endl; } return 0 ; }
-
删除
pop_back()和push_back()一样,都是从vector末尾进行尾行操作。pop_back()每次都会移除一个元素,因此调用两次pop_back()后,vector只剩一个元素。需要注意的是,如果vector为空,使用pop_back()将会产生异常结果,因此需要empty()来确定vector不为空。
二分查找(LeetCode704)
左闭右闭区间
- right = numsize - 1;
- [1,1] while(left <= right);
- left = middle + 1;right = middle - 1。
int search(vector<int>& nums, int target) { //左闭右闭
int left = 0;
int right = nums.size()-1;
while(left <= right){
int middle = left + (right - left) / 2; //防溢出
if(nums[middle] == target){
return middle;
}
else if (nums[middle] > target)
{
right = middle - 1; //middle一定不满足target,不能包含在区间内
}
else if (nums[middle] < target)
{
left = middle + 1;
}
}
return -1;
}
左闭右开区间
- right = numsize;
- [1,1) while(left < right);
- left = middle + 1;right = middle。
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
while(left < right){
int middle = left + (right - left) / 2;
if(nums[middle] == target){
return middle;
}
else if (nums[middle] > target)
{
right = middle;
}
else if (nums[middle] < target)
{
left = middle + 1;
}
}
return -1;
}
移除元素(LeetCode27)
暴力解法
每次发现目标者,将数组整体向前移动。
- j = i + 1;
- 每次移动完成后 i--,size--。
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for(int i = 0; i < size; i++){
if(nums[i] == val){
for(int j = i + 1; j < size; j++){
nums[j-1] = nums[j];
}
i--;
size--;
}
}
return size;
}
双指针
核心:遍历数据过程中遇到等于目标值就直接跳过,不等于目标值就赋值,这样就能过滤掉(也就是删除掉)目标值。
fast: 寻找新数组里所需要的元素。
slow: 新数组里的下标值;
且代表新数组长度的大小。
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];
}
}
return slow;
}