题目
思路:
二分查找target,但是不太会写循环。。
题解:
1. 需要三个变量,left, middle, right
2. 初始化:middle = (left + right)/2
3. 比较middle的值、target的值,选择下一个查找区间
4. 直到left = right,跳出循环
代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
//int middle = left + (right - left) / 2; //
int middle = (left + right) / 2; // 这样执行时间会更快一点
int ans = -1; // 目标下标
while (left <= right) {
if (target == nums[middle]) {
ans = middle; // target和nums[middle]相等的时候,下标middle即为答案
break;
}
else if (target > nums[middle]){
left = middle+1; //因为nums[middle]肯定不是target
//middle = left + ((right - left) / 2);
middle = (left + right) / 2;
}
else {
right = middle-1; //因为nums[middle]肯定不是target
//middle = left + ((right - left) / 2);
middle = (left + right) / 2;
}
}
return ans; // 返回结果
}
};
Debug过程:
-
while循环中直接比较
target
和middle
-
后面意识到了,想都没想,直接都改成
nums[target]
和nums[middle]
-
一直奇怪的报错,才从这张图中发现target其实不是下标,因为输出了数字9,而不是9对应的下标,傻了傻了…还以为是middle的计算发生了溢出55
-
修改之后,提交结果
-
试了一下,middle是不是会发生溢出,就把middle改成了原来的写法,执行用时减少了!
优化:
1. 不用使用ans
来表示结果,直接在while循环中return,循环外面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 (nums[middle] == target) {
return middle;
}
else if (nums[middle] < target) {
left = middle + 1;
}
else {
right = middle - 1;
}
}
return -1;
}
};
但是好像优化了个寂寞,只是代码减少了。