给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
// class Solution {
// public int search(int[] nums, int target) {
// // 自己写的:二分查找
// int minIndex = 0;
// int maxIndex = nums.length - 1;
// int middleIndex = (minIndex + maxIndex) / 2;
// while(minIndex <= maxIndex){
// if (target < nums[middleIndex]){
// maxIndex = middleIndex;
// middleIndex = (minIndex + maxIndex) / 2;
// }else if(target > nums[middleIndex]){
// minIndex = middleIndex;
// middleIndex = (minIndex + maxIndex) / 2;
// }else{
// return middleIndex;
// }
// }
// return -1;
// }
// }
// class Solution {
// public int search(int[] nums, int target) {
// // 更正:二分查找 左闭右闭区间
// // 先排除极端情况
// if(target < nums[0] || target > nums[nums.length - 1]){
// return -1;
// }
// // 然后进行二分查找
// int minIndex = 0;
// int maxIndex = nums.length - 1;
// while(minIndex <= maxIndex){
// int middleIndex = minIndex + ((maxIndex - minIndex) >> 1);// 这样为什么可以防止溢出?
// if (target == nums[middleIndex]){
// return middleIndex;
// }else if(target > nums[middleIndex]){
// minIndex = middleIndex + 1;
// }else if(target < nums[middleIndex]){
// maxIndex = middleIndex - 1;
// }
// }
// return -1;
// }
// }
class Solution {
public int search(int[] nums, int target) {
// 更正:二分查找 左闭右开区间
// 先排除极端情况
if(target < nums[0] || target > nums[nums.length - 1]){
return -1;
}
// 然后进行二分查找
int minIndex = 0;
int maxIndex = nums.length;
while(minIndex < maxIndex){
int middleIndex = minIndex + ((maxIndex - minIndex) >> 1);// 这样为什么可以防止溢出?两数相加可能溢出,相减不会
if (target == nums[middleIndex]){
return middleIndex;
}else if(target > nums[middleIndex]){
minIndex = middleIndex + 1;
}else if(target < nums[middleIndex]){
maxIndex = middleIndex;
}
}
return -1;
}
}