704.二分查找
使用二分查找 一般是看到题目中有写 有序数组
双指针 (left right)mid = left + (left -right) / 2 ----这是为了防止直接left right相加时发生溢出。
根据比较 target 和 nums[mid]的大小,不断更换 left 或者 right 指针的位置 。
有两个关键点:
因为我们选择的是左闭右闭区间,所以:
while(left<=right)
因为存在left = right = mid 此时的指向target的情况,所以并不能排除。
right=mid-1 / left = mid+1
我一开始写得 right = mid ,然后提交显示超出时间限制。
class Solution {
public:
int search(vector<int>& nums, int target) {
int low = nums[0];
int len = nums.size();
int high = nums[len-1];
int i = 0;
int j = len - 1;
while(i<=j)
{
int mid = (j+i)/2;
if(nums[mid]>target)
j = mid-1 ;
if(nums[mid] < target)
i = mid+1 ;
if(nums[mid] == target)
return mid;
}
return -1;
}
};
27.移除元素 --使用的是快慢指针
题目里没说有序数组。
动图理解就是如下:
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
要记住数组不能直接删除,只能覆盖!
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
int fast = 0;
int len = nums.size();
for(fast = 0;fast<len;fast++)
{
if(nums[fast] != val)
{
nums[slow] = nums[fast];
slow ++;
}
}
return slow;
}
};