704. 二分查找 - 力扣(LeetCode)
思路:
定义头尾两个指针 left right
定义中间变量middle = left + ((right -left)/2)
根据nums[middle]与target的比较大小更新左右指针
左闭右闭(包含右区间则 while(left<=right),right =nums.size()-1 ,right = middle -1;)
左闭右开(包含右区间则 while(left<right),right =nums.size(),right = middle -1;)
左闭右闭
class Solution {
public:
int search(vector<int>& nums, int target) {
int left =0;
int right =nums.size() - 1;//定义target 在左闭右闭的区间内
while(left<=right){
int middle = left +((right - left)/2);//防止溢出 等同于(right + left)/2
if(nums[middle] < target){
left = middle + 1;
}else if(nums[middle] > target){
right = middle -1;
}else {
return middle ;
}
}
return -1;
}
};
左闭右闭
class Solution {
public:
int search(vector<int>& nums, int target) {
int left =0;
int right =nums.size() - 1;//定义target 在左闭右闭的区间内
while(left<=right){
int middle = left +((right - left)/2);//防止溢出 等同于(right + left)/2
if(nums[middle] < target){
left = middle + 1;
}else if(nums[middle] > target){
right = middle -1;
}else {
return middle ;
}
}
return -1;
}
};
27. 移除元素
思路:数组的元素修改不是简单的删除,而是覆盖
快慢指针
思路:双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针(大任务是找不到,找到是特殊情况,也就是假设说大部分情况不等于目标值target,这也是判断条件:目标值不等于当前快指针指向的值时,将当前值放入慢指针索引的位置)
-
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
-
慢指针:指向更新 新数组下标的位置
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow =0;
for(int fast =0;fast<nums.size();fast++){
//设置快慢指针
if(val != nums[fast]){
//当没有找到目标值时,则该数为新数组需要的数,赋值为
//慢指针的值,满指针数值++,找到目标值则不执行该判断
nums[slow] =nums[fast];
slow++;
}
}
return slow;
}
};