在升序数组nums中寻找目标值target,对于特定下标i,比较nums[i]和targrt的大小
如果nums[i] = target,即下标i即为要寻找的下标
如果nums[i] < target,则target只可能在i的右侧
如果nums[i] > target,则target只可能在i的左侧
基于以上想法,可以在有序数组里使用二分查找寻找目标值
二分查找的做法是: 定义一个查找的范围[left,right],初始查找范围是整个数组。之后的查找取数组的中点[mid],比较nums[i] 和target的大小,如果相等则mid即为要寻找的下标,如果不相等,则根据nums[i]和target的大小将数据的查找范围缩小一半。
由于每次查找都会将查找范围缩小一半,所以二分查找的时间复杂度为0(log n),其中n是数组的长度。
二分查找的条件是查找范围不为空,即left <= right,如果targrt在数组中,二分查找可以保证查找出targrt的位置,返回targrt在数组中的下标,。如果targrt不在数组中,则当left > right时结束查找,返回-1。
代码如下:
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length-1;
while(left <= right) {
int mid = (right - left) / 2 + left;
int num = nums[mid];
if (num == target) {
return mid;
} else if (num > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
}