力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
定义 target 是在一个在左闭右闭的区间里,也就是[left, right]
区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:
- while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
- if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
-
例如在数组:1,2,3,4,7,9,10中查找元素2,如图所示:
class Solution {
public:
int search(vector<int>& num, int target)
{
int start = 0;
int end = num.size() - 1;
int mid = (start + end) / 2;
while (start<=end)
{
if (target == num[mid])
return mid;
else if (target < num[mid])
{
end = mid - 1;
mid = (start + end) / 2;
}
else
{
start = mid + 1;
mid = (start + end) / 2;
}
}
return -1;
}
};
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
- 这里的快指针就是按照正常for循环中的i的值,慢指针则是在比较下得到的不是目标数的数组下标
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int count = 0;
for (int i = 0;i < nums.size();i++) {
if (nums[i] != val) {
nums[count++] = nums[i];
}
}
return count;
}
};
第一次写的时候写成了nums[++count] = nums[i];发现执行错误
count++,因为执行完这句就是下一个数组 下标了,如果找到了就不会执行if语句即当前count就是目标数,需要用后面的数将其覆盖。