数组理论基础
参考代码随想录数组理论基础。
704.二分查找
题解
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
总结
上面给出的是二分查找左闭右闭的写法。写边界处理条件和left、right变了更新逻辑的时候,遵循区间定义不变量原则即可。
27.移除元素
题解
int removeElement(vector<int>& nums, int val) {
int fast = 0, slow = 0;
for (; fast < nums.size(); fast++) {
if (nums[fast] != val) nums[slow++] = nums[fast];
}
return slow;
}
总结
双指针法,用双指针解题时候一定要明确指针所指示的对象,比如说27.移除元素这一题,fast用来遍历数组,去搜寻不等于val的元素,slow指向目标数组尾部待插入新元素的位置。然后就是要搞清楚指针移动的逻辑,fast要遍历数组查看原数组每一个元素是否等于val,如果不等于val就会被放到slow指向的位置,故fast每一次循环走一步。而slow只有在fast找到不等于val元素的时候才会更新。另外,这里的删除数组中值为val的元素是逻辑上的删除,是值覆盖,原先存放val的位置会被新元素覆盖掉。