本来我是打算自行刷题的,但是奈何自制力太差,从三月份开始刷题到现在六月份了,才做了六十道题,进度太慢,因此还是选择了参加训练营。由于前面部分题目我刷过一次了,所以只要有时间拓展题目我也会做。
数组理论基础
- 数组是存放在连续内存上的相同类型数据的集合(二维数组也连续),因此在增删数组元素时,牵一发而动全身
- 数组中所谓的删除实际是覆盖
704.二分查找
这道题我是二刷,但是还是不妨碍我做错了。。。有几个重点:
- 首先明确下面代码要用哪种区间:[左闭,右闭],或是 [左闭,右开)
- 区间的开闭影响了while(循环条件)
- 本次犯错的点在于:在判断nums[mid]与target的大小时,mid下标的元素已经访问比较过了,因此在计算新区间时,应该把mid剔除!!!不要包括mid了。
- 算中点时使用:
int mid = left + (right - left)/2
而不是(right + left)/2
可以避免溢出
二分查找法的拓展题
- 35.搜索插入位置:根据区间不同,注意最后插入的位置应该是left或是其他
- 34.在排序数组中查找元素的第一个和最后一个位置:小心left和right在找到元素后往两边扩展的时候要设置left>=0和right<=len-1;vector压入数据要用push_back(), stack压入数据用push()
- 69.x的平方根:也可以用二分查找,但是注意在
mid * mid
时,要防止溢出,因此要写成(long long)mid * mid
- 367.有效的完全平方数:比69简单
27.移除元素
- 暴力法思路很简单,但是也有细节要注意,比如覆盖了之后需要进行
size--
和i--
- 双指针法:我的思路和卡尔的是反的,我设置成了slow指针不等于val时,fast快指针给slow赋值,等于val时,快指针++;而卡尔始终是对fast快指针,当快指针不等于val时,赋值,当快指针等于val时++
拓展题
- 26.删除有序数组中的重复项
- 283.移动零
- 844.比较含退格的字符串
- 977.有序数组的平方
- 同思路27