今日任务
数组理论基础,704. 二分查找,27. 移除元素
704. 二分法查找
使用二分法的必要条件之一:有序数组、数组中无重复元素
区间定义方法:左闭右闭[left, right],左闭右开[left, right)
// 左闭右闭
int left = 0;
int right = nums.size() - 1;
while(left <= right){
int middle =(left + right) / 2;
if(nums[middle] < target){
left = middle + 1;
} else if (nums[middle] > target){
right = middle - 1;
} else {
return middle;
}
}
return -1;
// 左闭右开
int left = 0;
int right = nums.size() - 1;
while(left < right){
int middle =(left + right) / 2;
if(nums[middle] < target){
left = middle + 1;
} else if (nums[middle] > target){
right = middle;
} else {
return middle;
}
}
return -1;
特别说明下 右移运算符 >> 和 / 2 的区别
">>"只能操作整数,而 "/" 可以操作不同类型的数据:浮点数除法最终结果是浮点数,整数除法的最终结果是整数。
只有当被操作数数据类型为知大于0的整数时,n >> 1 和n / 2的结果是一样的。
通常情况下,">> 1" 会比整数除法速度快。涉及容到浮点数的除法速度是最慢的。
">>" 的优先级比 "/" 低,在同时参与的运算中,先计算乘除,后计算左移或右移
27. 移除元素
快慢指针法
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
// 双指针法
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;