一、知识点
数组理论基础
1、数组是存放在连续内存空间上的相同类型数据的集合。
二维数组在地址空间上是连续的。
注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。
2、数组的元素是不能删的,只能覆盖。
二、题目
704. 二分查找
1、题目链接
https://leetcode.cn/problems/binary-search/
2、题目建议
需彻底掌握
选做题:同类型题,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。
35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置
3、做题思路
想想小学数学题 0~100,怎么快速找一个数?
中位数是50,如果要找33或者是77,通过左右值的移动,不断更新中间值。
4、代码细节
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right)
{
// 注意点1
int middle = (left + right) / 2;
// 注意点2
if (target < nums[middle]) right = middle - 1;
else if (target > nums[middle]) left = middle + 1;
else return middle;
}
return -1;
}
};
27. 移除元素
1、题目链接
https://leetcode.cn/problems/remove-element/
2、题目建议
双指针法是本题的精髓,需要掌握
3、做题思路
1)数组的元素是不能删的,只能覆盖
2)双指针法的应用:快指针遍历原数组nums,判断是否与val相等;慢指针覆盖原数组nums
4、代码细节:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
// 注意点1:快指针遍历原数组nums,判断是否与val相等;慢指针覆盖原数组nums
for(int fast = 0; fast < nums.size(); fast++)
{
if(nums[fast] != val)
{
nums[slow] = nums[fast];
// 注意点2:slow++ 和 ++slow 相同
slow = slow + 1;
}
}
// 注意3:slow已经自增过了
return slow;
}
};