题目:704. 二分查找
解题思路
- 思路:给定一个 nums 数组,注意数组是升序排列的;那么,找到当前 target 元素是否存在于数组之中,可采用二分法查找
- 注意:此处定义该数组区间定义:【左闭右闭】/【左闭右开】
- 使用left指向数组头,right 指针指向数组尾, mid 用于计算二分查找的位置,mid=left+(right-left)/2,避免由于 left 和 right 过大导致计算结果溢出的现象
- 如果当前 nums[mid] 比 target 大,那么就往左边找;反之,则向右边找;如果相等,说明找到了,返回当前的 mid 值即可
- 结束条件,当前的 left 移动到了 right 的右边,则说明两指针之间已不存在元素,则返回-1即可
C++代码实现
int search(int* nums, int numsSize, int target){
int left=0,right=numsSize-1; //左右指针,分别指向数组头和尾
// 左指针在右指针左边,或指向同一位置时进行循环
while(left <= right){
int mid = (left+right+1)/2;
if(nums[mid] < target){
left = mid + 1;
}else if(nums[mid] > target){
right = mid - 1;
} else {
return mid;
}
}
return -1; //未查询到返回-1
}
Java代码实现
解法一:假设该区间为【左闭右闭】
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 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;
}
}
解法二:假设该区间为【左闭右开】
class Solution {
public int search(int[] nums, int target) {
//定义数组元素为左闭右开的区间,即不包括右边元素
int left = 0, right = nums.length;
while(left<right) {
int mid = left + (right-left)/2;
// System.out.printf("%d", mid);
if(nums[mid] < target) {
left = mid + 1;
} else if(nums[mid] > target) {
// 此时,因为该区间是左闭右开区间,不包括右元素,则将right值设置为mid
right = mid;
} else {
return mid;
}
}
return -1;
}
}