二分法
先把正确答案放出来(取前不取后)
class Solution {
public:
int search(vector<int>& nums, int target) {
int middle, head, end;
head = 0;
end = nums.size();
while (head < end) {
middle = head + (end - head) / 2;
if (nums[middle] == target)
return middle;
if (nums[middle] > target)
end = middle;
if (nums[middle] < target)
head = middle + 1;
}
return -1;
}
};
return middle;
使用数组的时候要很注意是否超出数组的长度限制:
例如while循环这一句我有一种错误写法和两种正确写法
while (head <= end)
for (int i = 0; i <= nums.size()/2; i++)
//以上两个是对的
for (int i = 0; i < (nums.size()+1)/2; i++)
//数组元素个数是二的时候会出问题
for (int i = 0; i < nums.size()/2; i++)
//问题同上
接下来是取后不取前
class Solution {
public:
int search(vector<int>& nums, int target) {
int middle, head, end;
head = 0;
end = nums.size() - 1;
while(head <= end) {
middle = head + (end - head) / 2;
if (nums[middle] == target)
return middle;
if (nums[middle] > target)
end = middle - 1;
if (nums[middle] < target)
head = middle + 1;
}
return -1;
}
};
两种方法的主要区别是while判定的时候的相等和middle在不取后的时候就可以直接middle = head。
移除元素
移除元素尝试过暴力求解但是时间一直过长,这里放一下代码,主要说说快慢指针;
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for (int i = 0; i < size; i++) {
if (nums[i] == val) {
for (int j = i + 1; j < size; j++) {
nums[j - 1] = nums[j];
}
i--;
size--;
}
}
return size;
}
};
其核心思想就是让后一位元素“代替”前一位元素;但是要记住因为后一位元素前移一定要i--这样才能保证连续的val被识别到
快慢指针主要核心就是两个指针错位指到数组元素;即是两辆车,快指针永远正常行驶,在没遇到“val”就会拉一下后面的慢指针并且传值,如果遇到了,就抛下慢指针,并且不传值,这样代码避免的两个for语句,运行速度了不少。