题目描述
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
本题思路
这道题题目的前提是数组为有序数组且无重复的元素。否则会导致查找的下标不唯一。
左闭右闭
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if(nums[mid] > target) {
right = mid - 1;
}
else if (nums[mid] < target) {
left = mid + 1;
}
else return mid;
}
return -1;
}
};
搜索区间为左闭右闭,那么排除的答案就不应该出现在边界及边界以内。
当nums[mid] > target时,nums[left] <= target <= nums[mid-1] < nums[mid]。nums[mid]肯定不等于目标数那么就排除mid所指的数,边界-1则right = mid - 1。
当nums[mid] < target时,nums[mid] < nums[mid+1] <= target <= nums[right]。与上类似。
左闭右开
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] > target) { //nums[left] <= targrt < num[mid]
right = mid;
}
else if (nums[mid] < target) {
left = mid + 1;
}
else return mid;
}
return -1;
}
};
搜索区间为左闭右开想把数组中的所有值包含在内就right指针需要+1。
左区间与左闭右闭一样。
当nums[mid] > target时,nums[left] <= targrt < num[mid]。因为搜索区间为左闭右开,本身的区间右边界是不包含在搜索区间内。nums[mid]是排除的答案也就是不应该包含在搜索区间内。如果要是right = mid - 1 反而有可能将答案排除在外所以right = mid