题目:
给定一个 n 个元素有序(升序)的整型数组 nums, 和一个目标值 target ,写一个函数搜索nums中的target,如果目标值存在,返回下标,否则返回 -1
解题( Java ):
class Solution {
public int search(int[] nums, int target) {
int firstIndex = 0;
int lastIndex = nums.length - 1;
while(firstIndex <= lastIndex){
int index = (lastIndex + firstIndex ) / 2;
int num = nums[index];
if(target == num){
return index;
}else if(target > num){
//取后半部分较大的值
firstIndex = index + 1;
}else {
//取前半部分较小的值
lastIndex = index - 1;
}
}
return -1;
}
}
思路解析:
题目规定数组为有序且不存在重复元素,这就符合了 二分查找 的前提(在工作中可以注意存在这种情况可以考虑二分查找)
二分查找逻辑简单,主要考虑的就是边界问题
1、什么时候需要停止对数组的分割?其中一种思路是 左边界大于右边界 的时候。所以上面解题代码while中写的是first <= last
2、边界的转移问题:如果目标值大于数组选中的值,则说明目标值存在于右半部分,则需要挪动左边界下标,即firstIndex,需要把当前二分的下标index赋值给firstIndex,但这里为什么要+1呢,很简单,因为index这个值已经比较过了,所以firstIndex应该再次向右移动一位,同理如果目标值小与数组选中的值,说明目标值存在左半部分,即需要lastIndex = index – 1.