提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
第一次写博客,万事开头难。第一天简要学习了数组与二分法的基本概念。并在视频的帮助下尝试了题目,发现自己基础有些薄弱,因此第一天贴一点看到的基础知识。
一、二分法&双指针
引用:
一、两种二分法
先来看左闭右闭
1:while判断需要加上等于号 left <= right 因为在右闭状态下 = 有意义
2:right = nums.size() - 1 因为数组下标从0开始
3:当num < target时 ,right = mid - 1; 因为右边是闭合的
然后再来看左闭右开
1:while判断不需要加等于号 left < right 因为在右开状态下 = 无意义
2:right = nums.size() 因为右边是开的,所以可以多加1
3:当num < target时 ,right = mid ; 因为右边是开的
二、双指针
双指针(快慢指针)
可以实现修改数组上的值
快指针每一次循环会遍历一个数组的一个数(遍历过程中判断数是否为我们需要删除的)
如果不是:慢指针指向的数组位置的值 = 快指针指向数组位置的值(并且慢指针++)
如果是: 慢指针不变 ,所指的数值也不变
————————————————
原文链接:https://blog.csdn.net/JINbigXIA/article/details/137857393
二、题目
1.T704
代码如下(示例):
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
};
相关题目:
见代码随想录:二分查找
2.T27:移除元素 :双指针法(今日重点)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int valid_index = 0;
// 遍历数组
for (int i = 0; i < nums.size(); ++i) {
// 当前元素不等于目标值时,将其移动到有效元素位置
if (nums[i] != val) {
nums[valid_index] = nums[i];
valid_index++;
}
}
// 返回新长度
return valid_index;
}
};
总结
注意:
- 二分法的使用条件
- 双指针法