704.二分查找
标签
1: 有序数组
2: 无重复元素
方法: 二分查找
难点:
mid = left + (right - left) / 2 求两个数的中间数
左闭右闭,example: [1,5] = 1,2,3,4,5 1和5包括在里面 left = 0, right = 4 mid = 0 + (4-0)/2 = 2(index) = 第三个元素 = 3. left = mid + 1 = 2(index) + 1 = 3(index) , left 指向4,right指向5
左闭右开,example: [1,5) = 1,2,3,4 包括1但不包括5
left = mid + 1 当mid小于target,left为mid的下一个数 (左闭右闭)
class Solution {
public:
int search(vector<int>& nums, int target)
{
int left = 0;
int right = nums.size() - 1;
while(left <= right)
{
// L = 0 , R = 5, 一共6个元素, mid = 2 2+1 = 3 第4个元素
// L = 0 , R = 6, 一共7个元素, mid = 3 3+1 = 4 第5个元素
// L = 0 , R = 7, 一共8个元素,mid = 3 3+1 = 4 第5个元素
int mid = left + ((right - left) / 2) ;
//左闭右闭
if(nums[mid] > target){
right = mid -1;
}else if(nums[mid] < target){
left = mid + 1;
}else{
return mid;
}
}
return -1;
}
};
27. 移除元素
重点: 双指针
快指针: 遍历数组
慢指针:创建需要的数组
快指针将符合条件的元素与慢指针交换
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
int fastIndex = 0;
while (fastIndex < nums.size()){
if(nums[fastIndex] != val){
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
fastIndex++;
}
return slowIndex;
}
};