一、二分法
二分法是一种常用的算法。它的基本思想是通过将问题的搜索区间按照中间分割,然后判断目标值在左侧还是右侧,从而缩小搜索范围,直到找到目标值为止。
在使用二分法解决问题时,需要满足以下条件:
- 搜索区间必须是有序的,通常是有序数组。
- 可以通过比较目标值与中间元素的大小关系来决定搜索方向。
具体步骤如下:
- 初始化搜索区间左边界 left 和右边界 right。
- 循环执行以下步骤直到找到目标值或搜索区间为空:
a. 计算中间位置 mid = (left + right) / 2。
b. 比较目标值与中间位置的元素值的大小关系:- 如果目标值等于中间位置的元素值,返回中间位置作为结果。
- 如果目标值小于中间位置的元素值,将右边界更新为 mid - 1。
- 如果目标值大于中间位置的元素值,则将左边界更新为 mid + 1。
- 如果循环结束仍未找到目标值,则返回不存在的结果。
二分法的时间复杂度为 O(log n),其中 n 是搜索区间的大小。它通常用于在有序数组中查找特定元素或满足某种条件的元素。
二、自己的错误思路
1.0版本
这就完全是属于瞎写了。没有一点思路,不知道是二分法的背景下写的。
class Solution {
public:
int search(vector<int>& nums, int target) {
vector<int>::iterator itr;
for(itr=nums.begin();itr!=nums.end();itr++){
if (*itr==target){
cout<<itr<<endl;
break;
}
}
if(itr=-nums.end()){
cout<<-1<<endl;
}
}
};
2.0版本
看了代码随想录的教学视频后,写的代码。
但是忽略了数组下标和数组元素的关系。
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int middle = (left + right)/2;
if (target < middle){
right = middle-1;
}
else if(target > middle){
left = middle+1;
}
else{
return middle;
}
}
return -1;
}
};
三、正确答案
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int middle = (left + right)/2;
if (target < nums[middle]){
right = middle-1;
}
else if(target > nums[middle]){
left = middle+1;
}
else{
return middle;
}
}
return -1;
}
};