前言
刷题第一天,数组
1、数组初始化分配内存
int record[26] = {0};
2、vector排序函数:sort(A.begin(),A.end());
3、vector res = {1, 2, 3, 4};
4、vector int res(10,0); // 创建一个大小为10的vector
vector<vector> res(10, vector(10, 0)) // 创建一个10*10的二维vector
5、查找vector中的元素
vector<int>::iterator aa = find(visited.begin(), visited.end(), 5); // 如果vector是空的,出现段错误
if (aa == visited.end()) 没找到
else *aa 找到了返回值
一、数组
1.一维数组
数组通过下标索引的方式获取下标下对应的数据
数组是存放在连续内存空间上的相同类型数据的集合,也就是说数组内存空间的地址是连续的
因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址,注意:数组的元素是不能删的,只能覆盖
2.二维数组
C++中二维数组在地址空间上是连续的
例子
int array[2][3] = {
{0, 1, 2},
{3, 4, 5}
};
PS:vector的底层实现是array,但严格来讲vector是容器,不是数组。之后补充
二、题
1. 704 二分查找
前提条件:有序数组、无重复元素
着重点:
1、while的退出条件非常重要,小于等于:while(left <= right)
2、取中间值索引时非常重要:int mid = (right - left)/2 + left;
奇数个索引刚好在中间,偶数个索引在中间偏左位置
2. 27 移除元素
题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
双指针,感觉很难想,需要重点2刷。
核心思想:每次fast都会给slow值,除非fast指向了val
代码如下(示例):
int removeElement(vector<int>& nums, int val) {
int slow = 0;
int fast = 0;
while(fast < nums.size()){ // 每次fast都会给slow值,除非fast指向了val
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
// 2021年第一次做
int fast = 0;
int slow = 0;
int removeElement(vector<int>& nums, int val) {
for(fast = 0;fast<nums.size();fast++)
{
if(nums[fast] != val) //在快和慢没有分开时,当快指针不为val时,带着slow走
{ //在快和慢分开之后,,当快指针不为val,每次赋值结束,slow指针自加
nums[slow] = nums[fast]; //只要不赋值,慢指针就永远不自加
slow++;
}
//当快指针为val时,快指针自己走,第一次快与慢分开的时候就是第一次碰到val的时候
}
return slow;
}
补充:
1、暴力解法思路
一个for循环遍历数组,在找到val时,再用for循环将数组的所有元素向前移动覆盖val,O(n^2)
2、vector中erase接口复习
总结
二分查找和双指针,双指针需要2刷